Firebird TIBQuery-Einsatz mit der Rückkehr IN ...
Ich habe eine firebird 2.x-Datenbank mit Generator und einen trigger, um den Schlüssel zu generieren-Feld.
Ich brauche, um den zurückgegebenen Wert aus folgenden Abfrage.
INSERT INTO XXXX (vdate,description) values ('"+ VDate +"','"+ Description +"') returning vno INTO :ParamVoucherNo
Ich habe versucht, mehrere Versionen der code unten, aber es nicht wrok und ich bekomme
Dynamic sql error sql error code = -104
Ist es wirklich möglich, den Rückgabewert in delphi mit TIBQuery ?
Query1->SQL->Clear();
Query1->SQL->Add("INSERT INTO XXXX (vodate,description) values ('"+ VDate +"','"+ Description +"') returning vno INTO :ParamVoucherNo");
Query1->Params->ParamByName("ParamVoucherno")->ParamType = ptResult;
Query1->Params->ParamByName("ParamVoucherno")->DataType = ftInteger;
Query1->Params->ParamByName("ParamVoucherno")->Value = "";
Query1->Prepare();
Query1->ExecSQL();
Irgendwelche Vorschläge?
- Ich bin rusty auf der TADO, aber ich glaube, Sie haben die Möglichkeit auf eine Rendite Wert einfügen (ich nehme an, auto-increment) aus der Datenbank. Es sollte eine option auf die TADOQuery oder die TADOConnection-Objekte, um den Rückgabewert einer auto-increment. Ich bin nicht up-to-Geschwindigkeit auf firebird, aber das erfordert den Treiber realisieren die option. Die andere Möglichkeit ist folgende es mit einem SELECT MAX(ID) FROM Tabelle", aber das führt zu concurrency-Fehler und sollte vermieden werden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vom Firebird-README-Datei.Rückkehr:
Als IBX verwendet DSQL, sollten Sie ausschließen
INTO
Teil aus der Abfrage.INSERT ... RETURNING
für DSQL sieht genauso aus wie ein Aufruf einer gespeicherten Prozedur, die Ergebnis-set. Also, Sie haben zu verwendenOpen
stattExecSQL
.Ihre Vermischung von dynamischen SQL mit Parameter ist nur verwirrend.
Tun Sie dies:
Mit Delphi 6 habe ich die ID der Rückkehr erfolgreich mit einer EXECUTE BLOCK-Anweisung:
Von Delphi können Sie die folliowing:
IBX ist nicht Firebird bereit
können Sie einen Blick auf FIBPLUS, die Unterstützung der Firebird-features
Warum nicht den nächsten Wert für VoucherNo zuerst, gefolgt von
?
Ihre trigger kann dann entweder verzichtet werden (was schön ist), oder geändert, um zu erkennen null (oder <= null nützlich sein kann) und erst dann füllen Sie die vno Feld.
Client-Seite können Sie :
Durch ändern der trigger auf diese Weise ersparen Sie sich Kopfschmerzen später auf, falls/wenn Sie möchten, um Blöcke einfügen der Datensätze
Ich Frage mich, ob das
INSERT
gewickelt werden kann inEXECUTE BLOCK
Befehl.Würde IBX verwalten
EXECUTE BLOCK
dann?Hoffnung, um zu versuchen, es in beide IBX und Unified Interbase in XE2
PS: Auch wenn es nicht, ich fand die Bibliothek, das sagt arbeiten auf der Oberseite des IBX von Delphi XE2 (sowohl x86 als auch x64) und fügen Sie
EXECUTE BLOCK
Unterstützung: http://www.loginovprojects.ru/index.php?page=ibxfbutils#eb.Da ich weiß, es sollte einige änderungen an IBX gemacht. Intern
INSERT ... RETURNING
sollten in der gleichen Weise behandelt werden wie eine wählbare Verfahren, mit returning-Parameter.ich weiß, diese Frage wurde beantwortet, vor langer Zeit, aber ich muss schreiben dieses so klar wie möglich, für diejenigen, die brauchen, wie ich war.
ich auch, brauchte das "INSERT ... ZURÜCKGEBEN" zu tun.
die Delphi-fuhr mich verrückt für eine lange Zeit, bis ich änderte meine Data access components.
ich selbst zog aus Delphi XE2 auf XE5 nur, weil, dass...
Fazit : IBX unterstützt NICHT die RÜCKKEHR!
FireDAC ist PERFEKT für das, was ich brauche mit Firebird.
bewegen Sie einfach zu FireDAC und Sie werden in der Lage sein zu tun, alles, was Sie brauchen, und mit hoher Leistung.
Wenn Sie eine Tabelle mit 2 Feldern: GRP_NO und GRUPPENNAME und Sie möchten Holen Sie sich die neue GRP_NO verwenden Sie RET_ als Präfix, siehe Beispiel:
Aus der IBx2 Quellen, Sie können es so machen:
IResults-Schnittstelle Code:
Test Umgebung:
Arch Linux X86
Firebird 3
Lazarus 1.9
FPC 3.0.4
Kurzer Hinweis: Dies funktioniert auf der neuen Firebird-API in den IBX, Aber ich habe nicht testen Sie es mit der Legacy-Firebird-API mit dem IBX.