Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi ZStoredProc - Ergbnismenge (https://www.delphipraxis.net/52600-zstoredproc-ergbnismenge.html)

Thanatos81 31. Aug 2005 10:55

Datenbank: embedded Firebird • Version: 1.5.2.4731 • Zugriff über: ZEOS

ZStoredProc - Ergbnismenge
 
Hi DP!

Ich hab hier ne StoredProcedure in meiner FireBird-Table. Die funzt auch super. Nun möchte ich sie über ZEOS aus Delphi ansprechen, mache ich das so:
Delphi-Quellcode:
  StoredProc.Close;
  StoredProc.ParamByName('VName').Value := 'Sadelfeld';
  StoredProc.ParamByName('VVorname').Value := 'Hermann';
  StoredProc.Open;
  showMessage(IntToStr(StoredProc.paramByName('VLfdNr').asInteger));
Wird mir als VLfdNr (Rückgabewert eines AutoInc per Generator) immer 0 ausgegeben, obwohl ich im DBGrid sehen kann das es nicht stimmt.

Nutze ich diese Variante
Delphi-Quellcode:
 
  StoredProc.Close;
  StoredProc.ParamByName('VName').Value := 'Sadelfeld';
  StoredProc.ParamByName('VVorname').Value := 'Hermann';
  StoredProc.ExecProc;
  showMessage(IntToStr(StoredProc.paramByName('VLfdNr').asInteger));
bekomme ich ab dem zweiten Aufruf die Fehlermeldung, dass die Paramter nicht stimmen. Zusätzlich gibts ne Exception beim Trennen der Verbindung. Ist ja auch logisch, AFAIK ist ExecProc ja auch nicht für Ergebnismengen gedacht.

ABER auf diese Weise zeigt er mir den richtigen Wert für VLFdNr an :wall: Kennt jemand ne Lösung für mein Problem? Muss ich bei der ersten Variante anders auf den Rückgabeparameter zugreifen? :gruebel:

Schönen Gruß,
Thomas

P.S.: Sobald das klappt, nerv ich euch erstmal nicht mehr mit ZEOS+embedded Firebird. Dann muss ich erstmal die Grundfunktionen des eigentlich Progs basteln, und das krieg ich hin :D

Jelly 31. Aug 2005 11:49

Re: ZStoredProc - Ergbnismenge
 
Solltest du nicht vielleicht
Delphi-Quellcode:
paramByName('VLfdNr').asInteger
benutzen. Zeig mal die SP, was die liefert. Ein Recordset oder nur einen Wert als Parameter.

Thanatos81 31. Aug 2005 12:04

Re: ZStoredProc - Ergbnismenge
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Jelly
Solltest du nicht vielleicht
Delphi-Quellcode:
paramByName('VLfdNr').asInteger
benutzen.

Hä? Mach ich doch. Oder meintest du "Vielleicht solltest du nicht..."? Dann wäre das aber ja eine Wiederholung meiner Frage weiter oben (Muss ich bei der ersten Variante anders auf den Rückgabeparameter zugreifen?)

Zitat:

Zitat von Jelly
Zeig mal die SP, was die liefert. Ein Recordset oder nur einen Wert als Parameter.

Die liefert nur einen Integer-Wert zurück:

SQL-Code:
CREATE PROCEDURE INSERT_DATA (VName VARCHAR (30), VVorname VARCHAR(30))
RETURNS (VLfdNr INTEGER)
AS
begin
  VLfdNr = GEN_ID(G$_LfdNr, 1);

  INSERT INTO PROCTEST (
    Lfdnr,
    Name,
    Vorname)
  VALUES (
    :VLfdNr,
    :VName,
    :VVorname);
    SUSPEND;
end
Wobei alles bis zum begin nicht sicher ist, habe die SP mit IBeasy+ angelegt, im Anhang mal ein Screenshot davon.

Wie gesagt, wenn ich ExecProc nutze, klappts mit dem Rückgabewert auch. Nur kommen dann halt die Exceptions.

Jelly 31. Aug 2005 14:45

Re: ZStoredProc - Ergbnismenge
 
Zitat:

Zitat von Thanatos81
Zitat:

Zitat von Jelly
Solltest du nicht vielleicht
Delphi-Quellcode:
paramByName('VLfdNr').asInteger
benutzen.


Copy/Paste, und dann vergessen zu editieren.
Ich meinte FieldByName.. Aber da die Proc. eh nur einen Integer zurücklefert, ist das mit dem ParamByName auch ok.

Und da du keine Ergebnismenge von der Stored Procedure geliefert kriegst, sondern nur einen Parameter, ist ExecProc schon die richtige Wahl. Open verwendest du nur wenn du eine ganze Datenmengen geliefert kriegst, also das Ergebnis einer Select Abfrage.

Keine Ahnung, wo jetzt direkt dein Fehler sein könnte.

Thanatos81 31. Aug 2005 14:57

Re: ZStoredProc - Ergbnismenge
 
Mhh, dann werd ich nochmal weiter tüfteln, Danke erstmal.

Wenn ich was finde, dann schreib ichs mal hier rein, könnte ja auch für andere interessant sein :stupid:

Thanatos81 1. Sep 2005 10:40

Re: ZStoredProc - Ergbnismenge
 
Juhu :dancer: Habs geschafft. Und zwar funktioniert das ganze auf diese Weise:
Delphi-Quellcode:
  StoredProc.Close;
  StoredProc.ParamByName('VName').Value := 'Sadelfeld';
  StoredProc.ParamByName('VVorname').Value := 'Hermann';
  StoredProc.Open;
  showMessage(IntToStr(StoredProc.Fields[0].asInteger));
Wahrscheinlich ist es keine elegante Lösung, aber eine die im Gegensatz zu den anderen funktioniert...


//Edit: mit FieldByName hats übrigens nicht geklappt. Und Fields[0].Name gibt auch nen leeren String zurück...


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz