Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Rückgabeparameter bei FireBird (https://www.delphipraxis.net/151685-rueckgabeparameter-bei-firebird.html)

DeddyH 29. Mai 2010 09:03

Re: Rückgabeparameter bei FireBird
 
Ich habe gerade unter Linux mit Lazarus folgendes ausprobiert:
SQL-Code:
INSERT INTO Person(Name,Vorname) VALUES(:name,:vorname) RETURNING ID
Delphi-Quellcode:
  SQLQuery.Params.ParamByName('Name').Value := 'Mustermann';
  SQLQuery.Params.ParamByName('Vorname').Value := 'Max';
  SQLQuery.Open;
  ShowMessage(SQLQuery.FieldByName('ID').AsString);
Siehe da, mir wurde die ID ausgegeben. Unter Delphi dürfte das (je nach Zugriffskomponenten) ähnlich aussehen.

mkinzler 29. Mai 2010 09:09

Re: Rückgabeparameter bei FireBird
 
Die Rückgabe scheint sehr von den verwendeten Komponenten abzuhängen

DeddyH 29. Mai 2010 09:13

Re: Rückgabeparameter bei FireBird
 
Trotzdem würde ich es einmal mit Fields statt Params versuchen, wenn Letzteres nicht funktioniert.

idefix2 30. Mai 2010 12:37

Re: Rückgabeparameter bei FireBird
 
Delphi-Quellcode:
SQLQ := TSQLQuery.Create(SDIAppForm);
SQLQ.SQLConnection := SQLC;
SQLQ.SQL.Clear;
SQLQ.SQL.add('insert into Interpret (id,name) values (:id,:name);'); // returning id;');
SQLQ.PrepareStatement;
SQLQ.Params.Parambyname('id').value := 0;
SQLQ.Params.Parambyname('name').value := 'Testwert';
SQLQ.ExecSQL;
Ich habe jetzt versucht, die Werte als Parameter zu übergeben (in der Hoffnung, dann vielleicht in id eine Antwort zurückzubekommen - obwohl auch das unbefriedigend wäre, weil der mit returning zurückgegebene Wert eines SQL Statements muss ja nicht in allen Fällen einem übergebenem Feldelement entsprechen, sondern kann ja irgend ein errechneter Wert sein). Jetzt erzeugt schon der SQL Aufruf eine Exception, mit der für mich unverständlichen Fehlermeldung: "Die Feldnamen für %s konnten nicht erkannt werden".

omata 30. Mai 2010 15:20

Re: Rückgabeparameter bei FireBird
 
Hast Du auch mal das aus #11 probiert?

idefix2 30. Mai 2010 16:43

Re: Rückgabeparameter bei FireBird
 
Ich komme ja jetzt nicht einmal mehr dazu, das returning irgendwie auszuprobieren, weil das ExecSQL - mit und ohne returning - eine Exception auslöst, sobald ich Parameter verwende.
Wenn ich im SQL Statement keine Parameter verwende, sondern direkt die Werte angegebe, kennt er ein FieldByName ('id') nicht.

haentschman 30. Mai 2010 16:48

Re: Rückgabeparameter bei FireBird
 
Hallo...
Zitat:

Hast Du auch mal das aus #11 probiert?
...ich wiederhole das mal.

Denn anscheinend nicht. Es wurde schon mehrfach gesgt, daß du wenn du einen Rückgabewert erwartest OPEN statt EXECSQL benutzen mußt.

:hi:

idefix2 30. Mai 2010 22:20

Re: Rückgabeparameter bei FireBird
 
Ich habe sowohl open als auch execsql probiert. Das Verhalten ist in beiden Fällen exakt gleich:

SQL-Code:
SQLQ.SQL.add('insert into Interpret (id,name) values (''0'',''Testwert'') returning id;');
liefert beim Aufruf von Open oder ExecSQL keine Fehlermeldung, aber es gibt keinen Parameter id, dh der Zugriff auf SQLQ.Params.Parambyname('id') produziert eine Exception (was zu erwarten war, weil den Parameter id gibt es ja wirklich nicht).


SQL-Code:
SQLQ.SQL.add('insert into Interpret (id,name) values (:id,:name) returning id;');
erlaubt mir zwar, die Werte für
SQLQ.Params.Parambyname('id').value := 0;
SQLQ.Params.Parambyname('name').value := 'testwert';
zu setzen, dafür produziert der Aufruf von Open ebenso wie der Aufruf von ExecSQL eine Exception, nämlich
Die Feldnamen für %s konnten nicht erkannt werden
Dabei ist es egal, ob ich versuche, mit der Klausel "returning id" einen Rückgabewert zu bekommen oder ob ich diese Klausel weglasse. In dem Fall komme ich also gar nicht dazu, den Rückgabewert von
SQLQ.Params.Parambyname('id') anzuschauen.

omata 30. Mai 2010 23:23

Re: Rückgabeparameter bei FireBird
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier mal ein Beispiel, das wunderbar funktioniert.

Ist dir klar, was du alles in der Datenbank anlegen must, damit das überhaupt funktioniert? Das hat nämlich nichts mit Delphi zu tun. Falls nicht, siehe hier.

idefix2 31. Mai 2010 12:34

Re: Rückgabeparameter bei FireBird
 
Hallo omata,

Du verwendest in diesem Beispiel die Interbase DBX Komponenten. Das hatte ich als erstes versucht, leider absolut erfolglos.

In diesem Link ist beschrieben, dass mir mit den Komponenten nicht einmal ein Connect zur Firebird Datenbank gelungen ist. Das gleiche passiert mir bei Deinem Beispiel. Nach der Anpassung von Benutzername, Password und Datenbankpfad kommt auch hier die Fehlermeldung: connection rejected by remote interface, als wäre Benutzername oder Password falsch. Mit Isql und mit dbworkbench funktioniert der Zugriff. Ich verwende Delphi 2009 und Firebird 2.1. Im oben angeführten Thread haben verschiedene Poster gemeint, es liege daran, dass man mit den DBX Interbase Komponenten prinzipiell nicht auf Firebird zugreifen könne. Anscheinend geht es bei Dir doch, und es würde mich interessieren, in welcher Konstellation das geht.

Zitat:

Ist dir klar, was du alles in der Datenbank anlegen must, damit das überhaupt funktioniert
Im Posting #10 habe ich geschrieben: Das Insert wird ausgeführt, aber ich komme einfach nicht zum Rückgabewert.
Natürlich habe ich auch überprüft, ob in der Spalte id die richtigen trigger-generierten Werte ankommen, das ist alles in Ordnung. Nur der Rückgabewert in delphi ist das Problem.

Ich werde jetzt noch versuchen, Dein Beispiel mit möglichst wenig Änderungen auf die Firebird - DBX-Komponenten umzustellen - mit etwas Glück könnte es genügen, nur die Properties von SQLConnection geeignet anzupassen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:06 Uhr.
Seite 2 von 4     12 34      

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