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.