![]() |
Datenbank: FB • Version: 2.5 • Zugriff über: FIB Pro
TFIBQuery und Prepare
Hallo!
Vielleicht kennt sich ja hier jemand noch mit den FIB-Komponenten aus. Ich erzeuge mir einen neuen Query und versuche den zu preparen. Dabei bekomme ich aber eine SQL-Fehlermeldung:
Delphi-Quellcode:
Wenn ich dem jetzt in den Tiefen der FIB-Units nachgehe, wird aus dem
var
LQuery: TFIBQuery; begin LQuery := GetQueryForUse('SELECT * FROM TABELLENAME WHERE ID=:ID;'); try LQuery.Prepare; // <-- Invalid Token: ? LQuery.ParamByName('LFELDNAME').AsString := AFieldName; {...}
Code:
ein
SELECT * FROM TABELLENAME WHERE ID=:ID;
Code:
Normalerweise sollte das präparierte SQL aber noch gar nicht an die Datenbank gehen, weil ich ja noch gar keine Parameter zugewiesen habe. Scheint aber so als würde der FIBQuery genau das tun und versuchen, den Query schon auszuführen statt zu preparen.
SELECT * FROM TABELLENAME WHERE ID= ?;
Kennt jemand dieses Problem? Grüße Cody |
AW: TFIBQuery und Prepare
Doch, bei Prepared soll das jetzt schon an die Datenbank gehen und dort schonmal geparst/optimiert/gecached/... werden
und später werden dann nur noch die Parameter geschickt und das ausgeführt. Gerade dafür ist Prepared da, nur "einmal" das Query zum Server und dann einmal oder mehrmals die Parameter inkl. Ausfühhren. Vor allem mehrere Datensätze, damit dort die Behandlung des Query nur einmal erfolgen muß und die wiederholten Ausführungen sich das dann sparen können. Interbase scheint wohl bei sowas wohl ? als Platzgalter für Parameter zu nehmen, anstatt der namentlichen :Parameter. Meckert FB denn auch wirklich das ? an? |
AW: TFIBQuery und Prepare
Ein weiser Kollege gab mir den entscheidenden Tipp. Im konkreten Fall war der Query etwas komplexer und der Fehler lag in den Feinheiten. Ich hatte das hier vereinfacht dargestellt.
Code:
Das bekommt der FIB-Parser so nicht hin. Muss man so machen:
UPDATE TABELLENNAME SET :FELDNAME=:VALUE WHERE ID=:ID
Code:
Und dann mittels Format() vorformatieren. Dan wuppt das. Scheinbar kann man Parameter nur als Zuweisungswerte im Query platzieren. Ich bin als FIB-Neuling davon ausgegangen dass das nur "dumme" Platzhalter sind und deren Position keine Rolle spielt.
UPDATE TABELLENNAME SET %s=:VALUE WHERE ID=:ID
Trotzdem Danke! Grüße Cody |
AW: TFIBQuery und Prepare
Zitat:
aber dafür gibt es die Makros
Delphi-Quellcode:
Parameter sind "Werte" und keine "Bezeichner".
'UPDATE TABELLENNAME SET &FELDNAME=:VALUE WHERE ID=:ID'
//FieldByName() ParamByName('ID').AsInteger ParamByName('VALUE').AsString MacroByName('FELDNAME').Value Und Makros sind einfach nur Platzhalter.
Delphi-Quellcode:
'&abc &FELDNAME=:VALUE WHERE ID=:ID'
MacroByName('abc').Value := 'UPDATE TABELLENNAME SET'; |
AW: TFIBQuery und Prepare
Ich hatte die Queries bisher immer komplett mit Format() zusammengebastelt, allerdings war das auch MySQL. Die Variante mit den prepared Statements habe ich jetzt bei Delphi zum ersten Mal ausprobiert. Da wird man alt wie eine Kuh und lernt immer noch dazu ;-)
Wie ist das mit den Makros: Werden die bei Schleifendurchläufen wie die Werte auch jedesmal ersetzt oder nur einmalig? |
AW: TFIBQuery und Prepare
Hallo,
Macros kennt FB meines Wissens nicht. Also ersetzt FIB die bei jedem Aufruf. Prepared ist dann wohl etwas anderes. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:15 Uhr. |
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 by Thomas Breitkreuz