ZEOS Library – Einsatz mit Delphi und Firebird
TZStoredProc
Mit dieser Komponente ist es möglich, Stored Procedures einer Datenbank auszuführen. Man unterscheidet Stored Procedures in zwei Kategorien: Solche, die keine Ergebnismenge zurück liefern und solche, die eine Ergebnismenge zurück liefern. TZStoredProc funktioniert ähnlich, wie die BDE-Komponente. Der einzige Unterschied besteht darin, dass vor dem Aufruf von ExecProc kein explizites Prepare durchgeführt werden muss.
Stored Procedures mit einer Ergebnismenge
Wenn eine StoredProc eine Ergebnismenge zurückliefert, dann wird sie einfach nur (nachdem evtl. vorhandene Parameter mit Werten belegt wurden) mit einem Open geöffnet:
with spSumByName do begin Close; ParamByName('Name').Value := 'WeißIchWie'; Open; end;
Die Ergebnismenge kann anschließend ähnlich wie bei einem normalen TZQuery behandelt werden.
Stored Procedures ohne Ergebnismenge
Hat die StoredProc keine Ergebnismenge, dann wird sie mit ExecProc aufgerufen, nachdem die Parameter ggf. mit Werten versorgt wurden. Dazu ein Beispiel (es gilt: conConnection.AutoCommit = True):
with spDeleteByName do begin ParamByName('Name').Value := 'WeißIchWie'; conConnection.StartTransaction try // StoredProc ausführen ExecProc; except conConnection.Rollback; end; conConnection.Commit; end;
Vorsicht Fehler in der ZEOS Library V 6.1.5!
Wurde eine StoredProc mindestens einmal über ExecProc aufgerufen, dann wird beim späteren lösen der Datenbankverbindung (Disconnect) eine Exception „invalid statement handle“ mit der SQL-Fehlernummer -901 ausgelöst. Dieser Fehler tritt nicht auf, wenn die StoredProc über ein TZQuery oder TZReadOnlyQuery ausgeführt wird. Die Ausführung der StoredProc muss dann als SQL-Befehl in folgender Form in der Property SQL festgelegt werden:
EXECUTE PROCEDURE DeleteByName (:Name)
Die Ausführung geschieht dann ähnlich wie in der StoredProc. Es gilt wie oben: conConnection.AutoCommit = True:
// ein TZQuery-Objekt wird benutzt with qryDeleteByName do begin ParamByName('Name').Value := 'WeißIchWie'; conConnection.StartTransaction try ExecSQL; // SQL-Statement im TZQuery-Objekt ausführen except conConnection.Rollback; end; conConnection.Commit; end;
Info: Auch bei Dialekt 3 Datenbanken muss der Name der StoredProc nicht in Anführungszeichen stehen. Namen von Stored Procedures sind nicht case-sensitive.
Probleme von TZStoredProc bei Dialekt-1-Datenbanken
Ein weiteres Problem ist, dass die Metadaten von StoredProcs aus Datenbanken des Dialekt 1 nicht korrekt an die TZStoredProc-Objekte übertragen werden, wenn die StoredProc im Objektinspektor der Komponente ausgewählt wird. Die Parameterdaten werden nicht korrekt interpretiert. Ein Upgrade von Dialekt 1 auf Dialekt 3 behebt dieses Problem. Muss die Datenbank im Dialekt 1 bestehen bleiben, dann muss statt TZStoredProc ein TZQuery oder TZReadOnlyQuery eingesetzt werden.
Ein Gedanke zu „ZEOS Library – Einsatz mit Delphi und Firebird“
Kommentare sind geschlossen.
Lieben Dank für dieses tolle Tutorial. Es ist sehr klar und übersichtlich, und eine tolle Hilfe für den Einstieg.