Einzelnen Beitrag anzeigen

Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#11

Re: SProc misslungen: multiple rows in singleton select

  Alt 30. Jul 2006, 13:53
Danke an alle,

mit den letzten Hinweisen bin ich fast am Ende angekommen:
Zitat von dataspider:
SELECT TMP$USER_HOST FROM TMP$ATTACHMENTS WHERE TMP$USER = USER INTO :Computer_Name;
Dies liefert in der konkreten Situation tatsächlich mehr als einen Datensatz und führt deshalb zu dem Fehler (es hat also nichts mit den SP-Rückgabewerten oder dem Suspend zu tun, wie ich gedacht hatte).

Zitat von dataspider:
TMP$ATTACHMENTS erzeugt für jede Verbindung einen Datensatz.
Wenn sich der gleiche User 2 mal verbindet, liefert dann dein Select evtll 2 Records?
Die Lösung kann nur darin liegen, auch Computer_Name als Input-Parameter zu übergeben.

Zitat von dataspider:
Das Suspend kannst du bei der Fehlersuche vergessen. Da in Interbase auch Selected Procedures unterstützt werden, kannst du Suspend beliebig oft aufrufen. Es produziert keine Fehlermeldung. Der letzte zugewiesene Wert vor dem Suspend wird zurückgegeen.
Eben - deswegen bin ich wegen der Fehlermeldung und Hinweisen, die sich auf Suspend bezogen, durcheinander gekommen.

Zitat von Elvis:
Hier ist mal ein möglichst minimalistischer Ansatz, der mit dem Firebird DataProvider laufen sollte.
Code:
public static void LogbuchStart(IDbConnection connection,
                                int          datenNr,
                                int          selectionNr,
                                out int      neuId,
                                out bool     neuerMonat) //  und so weiter
Danke, so werde ich es machen. Bisher wollte ich mehrere Verfahren, die sich nur wenig unterscheiden, in einer Methode zusammenfassen und nur durch die Parameter unterscheiden; z.B.:
Code:
BdpCommand cmd = Connect.CreateCommand();
switch(Variante) {
case 1: cmd.CommandText = "Logbuch_Start"; cmd.Parameters.Add(...); break;
//  usw. }
try      {
    Connect.Open();
    cmd.ExecuteNonQuery();
    //  Parameter auswerten   }
catch (Exception ex)   {
    MessageBox.Show( "Fehler bei VS-Interna",
        cmd.CommandText + Environment.NewLine + ex.Message, System.Drawing.SystemIcons.Error);
}
finally { Connect.Close(); }
Das wird bei unterschiedlichen Parametern schnell unübersichtlich; also sind getrennte Methoden - wie von Dir vorgeschlagen - praktischer.

Mit einer Methode, die ich nach Deinem Vorschlag angepasst habe, klappt es jetzt fast vollständig. Nur folgendes Problem bleibt noch: "Neuer_Monat" ist auch in der SP ein boolean-Parameter. Aber die Auswertung klappt nicht:
Code:
BdpParameter param = cmd.Parameters[5];
if (param.Value != null && param.Value != DBNull.Value)
     b0 = (bool) param.Value; //  -- hier knallt es
else b0 = false;
liefert die Fehlermeldung:
Zitat:
Die angegebene Umwandlung ist ungültig.
Der Debugger zeigt deutlich die Problemstelle. Ich finde aber in der SDK-Doku keinen Weg, um param.Value zu einem bool-Parameter zu machen. Kann ich auch dazu noch einen Tipp bekommen?

Danke! Jürgen
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat