Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi TFIBQuery und Prepare (https://www.delphipraxis.net/197796-tfibquery-und-prepare.html)

Codehunter 5. Sep 2018 14:44

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:
var
  LQuery: TFIBQuery;
begin
  LQuery := GetQueryForUse('SELECT * FROM TABELLENAME WHERE ID=:ID;');
  try
    LQuery.Prepare; // <-- Invalid Token: ?
    LQuery.ParamByName('LFELDNAME').AsString := AFieldName;
    {...}
Wenn ich dem jetzt in den Tiefen der FIB-Units nachgehe, wird aus dem
Code:
SELECT * FROM TABELLENAME WHERE ID=:ID;
ein
Code:
SELECT * FROM TABELLENAME WHERE ID= ?;
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.

Kennt jemand dieses Problem?

Grüße
Cody

himitsu 5. Sep 2018 14:49

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?

Codehunter 5. Sep 2018 15:00

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:
UPDATE TABELLENNAME SET :FELDNAME=:VALUE WHERE ID=:ID
Das bekommt der FIB-Parser so nicht hin. Muss man so machen:

Code:
UPDATE TABELLENNAME SET %s=:VALUE WHERE ID=:ID
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.

Trotzdem Danke!

Grüße
Cody

himitsu 5. Sep 2018 15:48

AW: TFIBQuery und Prepare
 
Zitat:

Zitat von Codehunter (Beitrag 1412517)
Das bekommt der FIB-Parser so nicht hin. Muss man so machen:

Das bekommt kein DBMS hin,
aber dafür gibt es die Makros
Delphi-Quellcode:
'UPDATE TABELLENNAME SET &FELDNAME=:VALUE WHERE ID=:ID'

//FieldByName()
ParamByName('ID').AsInteger
ParamByName('VALUE').AsString
MacroByName('FELDNAME').Value
Parameter sind "Werte" und keine "Bezeichner".

Und Makros sind einfach nur Platzhalter.
Delphi-Quellcode:
'&abc &FELDNAME=:VALUE WHERE ID=:ID'

MacroByName('abc').Value := 'UPDATE TABELLENNAME SET';

Codehunter 6. Sep 2018 04:56

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?

hoika 6. Sep 2018 06:23

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 02:56 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