Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Probleme mit Stored Procs, ZEOS und Firebird embedded (https://www.delphipraxis.net/39341-probleme-mit-stored-procs-zeos-und-firebird-embedded.html)

lume96 1. Feb 2005 10:54


Probleme mit Stored Procs, ZEOS und Firebird embedded
 
Moin,

Ich weiß, dass das Thema hier schon mal am Rande erwähnt wurde, wollte nur kurz nachfragen, ob es bereits eine Lösung gibt (hab gesucht, aber selbst keine gefunden).

Gegeben sei : D7 Pro, Firebird embedded 1.5.2, Zeos 6.1.5 stable (hab’s auch mit der 6.5.1 alpha probiert, ändert aber nichts).

Ich versuche einfach eine Stored Procedure auszuführen (mit ExecProc) und hätte gerne den Rückgabewert. Das funktioniert soweit auch ganz gut beim ersten Durchlauf. Wenn ich aber die Stored Procedure ein zweites Mal aufrufe (oder wenn ich die Verbindung zu Firebird schließe) bekomme ich einen Fehler -901 (SQL Error : Invalid Statement handle…).

Das Problem bei mehrfachem Ausführen der Stored Procedure kann ich umgehen, wenn ich die Komponente vor jedem ausführen dynamisch erstelle und hinterher wieder freigebe (etwas umständlich, aber was soll’s). Bleibt das Problem beim Schließen der Verbindung zur DB.

Hat jemand eine Lösung für das Problem ?

Tschüss,
Lutz

Stevie 1. Feb 2005 11:55

Re: Probleme mit Stored Procs, ZEOS und Firebird embedded
 
Hi,

ich hab mal versucht, deinen Fehler nachzuvollziehen:
SQL-Code:
CREATE PROCEDURE TEST_5 
RETURNS (Result INTEGER)
AS
BEGIN
  Result = 5;
  SUSPEND;
END
Delphi-Quellcode:
ZStoredProc.StoredProcName := 'Test_5';
ZStoredProc.ExecProc;
ShowMessage(ZStoredProc.ParamByName('Result').AsString);
Kein Problem - auch bei mehrfachem Aufrufen.

Allerdings tritt der von dir genannte Fehler beim Schließen der Connection auf.
Eine Möglichkeit, diesen Fehler zu umgehen, wäre:
Delphi-Quellcode:
try
  ZConnection.Disconnect;
except
  on E: Exception do;
end;
MfG
Stevie

lume96 1. Feb 2005 12:23

Re: Probleme mit Stored Procs, ZEOS und Firebird embedded
 
Hi Stevie,
erst mal danke für die Antwort.

Hab vergessen zu erwähnen, dass meine Stored Proc auch Eingabewerte hat, die ich vor jedem Ausführen mit
Delphi-Quellcode:
ZStoredProc.ParamByName('Param1').AsString := 'abc';
ZStoredProc.ParamByName('Param2').AsInteger := 12;
setze.

Ausserdem ist mein Rückgabewert vom Typen Integer.

Ob's daran liegt werde ich später im Büro prüfen, denn davon abgesehen, sieht mein Quellcode dem von Dir angegebenen sehr ähnlich.

Tschüss,
Lutz

Stevie 1. Feb 2005 13:19

Re: Probleme mit Stored Procs, ZEOS und Firebird embedded
 
Hi Lutz,

ich hab nochmal genau geguckt und festgestellt, dass man zwischen Proceduren mit und ohne Rückgabe-Parameter unterscheiden muss.
Auf der Homepage von Domo Sokrat gibt's ein gutes Tutorial zu dem Einsatz von Zeos mit Firebird embedded.
Dort wird auch erklärt, wie man TZStoredProc benutzt und was dabei zu beachten ist.

MfG
Stevie

lume96 1. Feb 2005 13:42

Re: Probleme mit Stored Procs, ZEOS und Firebird embedded
 
Hi Stevie,

Danke für den Link zu dem Zeos Tuto.
Ich hatte mir das Firebird embedded Tuto von Domo Sokrat angesehen (wurde igrendwo auf der DP darauf hingewiesen), hatte den zweiten Teil (bezüglich ZEOS) allerdings übersehen. Mal sehen, ob ich damit meine Probleme lösen kann.

Trotzdem noch mal kurz zum Problem :

Ich hab's noch mal durchgetestet und der Fehler bei wiederholtem Aufruf einer Stored Proc tritt tatsächlich nur dann auf, wenn man der Stored Proc vorher einen Wert übergibt.

Z.B. folgende SP :
SQL-Code:
CREATE PROCEDURE TEST2_PROC (
    INVALUE INTEGER)
RETURNS (
    RESULT INTEGER)
AS
BEGIN
  result = :INVALUE;
  SUSPEND;
END
In Delphi :
Delphi-Quellcode:
  ZStoredProc.ExecProc;
  MessageDlg(IntToStr(ZStoredProc.ParamByName('RESULT').Value),mtInformation,[mbOK],0);

  ZStoredProc.ExecProc;
  MessageDlg(IntToStr(ZStoredProc.ParamByName('RESULT').Value),mtInformation,[mbOK],0);
funktioniert, während
Delphi-Quellcode:
  ZStoredProc.ParamByName('INVALUE').Value := 1;
  ZStoredProc.ExecProc;
  MessageDlg(IntToStr(ZStoredProc.ParamByName('RESULT').Value),mtInformation,[mbOK],0);

  ZStoredProc.ExecProc;
  MessageDlg(IntToStr(ZStoredProc.ParamByName('RESULT').Value),mtInformation,[mbOK],0);
beim zweiten ExecProc nicht mehr funktioniert.

Schon komisch.

Tschüss,
Lutz


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:07 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