AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi TFIBQuery und Prepare
Thema durchsuchen
Ansicht
Themen-Optionen

TFIBQuery und Prepare

Ein Thema von Codehunter · begonnen am 5. Sep 2018 · letzter Beitrag vom 6. Sep 2018
Antwort Antwort
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#1

TFIBQuery und Prepare

  Alt 5. Sep 2018, 15:44
Datenbank: FB • Version: 2.5 • Zugriff über: FIB Pro
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
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: TFIBQuery und Prepare

  Alt 5. Sep 2018, 15:49
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?
$2B or not $2B

Geändert von himitsu ( 5. Sep 2018 um 15:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: TFIBQuery und Prepare

  Alt 5. Sep 2018, 16:00
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
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: TFIBQuery und Prepare

  Alt 5. Sep 2018, 16:48
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';
$2B or not $2B

Geändert von himitsu ( 5. Sep 2018 um 16:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: TFIBQuery und Prepare

  Alt 6. Sep 2018, 05:56
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?
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: TFIBQuery und Prepare

  Alt 6. Sep 2018, 07:23
Hallo,
Macros kennt FB meines Wissens nicht.
Also ersetzt FIB die bei jedem Aufruf.

Prepared ist dann wohl etwas anderes.
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:54 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