Einzelnen Beitrag anzeigen

Jürgen Thomas

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

SProc misslungen: multiple rows in singleton select

  Alt 20. Jul 2006, 18:18
Datenbank: Interbase • Version: 7.5 • Zugriff über: NET 1.1 Borland Data Provider
Hallo,
nachdem ich mich in WinForms, C# und Interbase mit IBConsole eingearbeitet habe, möchte ich jetzt die Datenbank mit der Anwendung verbinden. Der Einfachheit halber verwende ich die BDP-Klassen, möchte aber die Eigenschaften überwiegend zur Laufzeit zuordnen.
Connection und Select klappen.
Probleme habe ich mit dem Aufruf einer StoredProcedure, die 2 Werte zurückgeben soll:

SQL-Code:
CREATE PROCEDURE Logbuch_Start
        ( Daten_Nr INTEGER, Selektion_Nr INTEGER, Formular_Nr SMALLINT )
RETURNS ( neu_ID INTEGER, Neuer_Monat BOOLEAN ) AS
BEGIN
  /*  alle Inhalte beschränkt auf das, was die Rückgabewerte betrifft  */
  neu_ID = GEN_ID( Logbuch_id, 1 );
  INSERT INTO Logbuch Values ( ... );
  /*  Einstellungen aktualisieren  */
  Neuer_Monat = False;
  IF ( Formular_Nr = 0 )
  THEN BEGIN
    /*  einige weitere Befehle  */
    Neuer_Monat = True;
  END
  /*  die folgende Zeile ist der einzige Suspend-Befehl in dieser Prozedur  */
  SUSPEND;
END
Im Programm benutze ich folgende Befehle:
Code:
cmdUpdate.CommandType = CommandType.StoredProcedure;
//  die eckigen Klammern oder @ werden entgegen Borland-Doku nicht benötigt,
//  sondern von Interbase als Fehler bemängelt
sCommand = "Logbuch_Start";
cmdUpdate.Parameters.Clear();
cmdUpdate.ParameterCount = 5;
param1 = new BdpParameter("Daten_Nr",      BdpType.Int32, 0);
param2 = new BdpParameter("Selektion_Nr", BdpType.Int32, 0);
param3 = new BdpParameter("Formular_Nr", BdpType.Int16, 0);
param4 = new BdpParameter("Neu_ID", BdpType.Int32);
param4.Direction = ParameterDirection.Output;
param5 = new BdpParameter("Neuer_Monat", BdpType.Boolean);
param5.Direction = ParameterDirection.Output;
cmdUpdate.Parameters.Add(param1);
cmdUpdate.Parameters.Add(param2);
cmdUpdate.Parameters.Add(param3);
cmdUpdate.Parameters.Add(param4);
cmdUpdate.Parameters.Add(param5);
try   {
  cmdUpdate.Connection = Connect;
  cmdUpdate.CommandText = sCommand;
  Connect.Open();
  cmdUpdate.ExecuteNonQuery();
  //  Fehler tritt ebenso auf bei:
  //  BdpDataReader Reader = cmdUpdate.ExecuteReader();
  //  usw. }
catch { ... }
finally { Connect.Close(); } }
Dies führt zu folgender Exception.Message:
Zitat:
Ausführung misslungen - multiple rows in singleton select
Die Ausführung der SP durch IBConsole funktioniert wunschgemäß. Was habe ich hier noch nicht verstanden? (Bitte beachten: Es gibt wirklich nur einen suspend-Befehl in der Prozedur; also kann es auch nur eine einzelne Zeile mit 2 Rückgabewerten geben.)

Außerdem: Wie komme ich an die Rückgabewerte heran - durch Abfrage von cmdUpdate.Parameters oder durch Auswertung von Reader oder...?

Danke für Tipps! Jürgen

PS. Bitte nicht wundern: ich werde in den nächsten Tagen nicht am PC sein; aber dieses Problem wollte ich vorher noch los werden.
#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