![]() |
Datenbank: Firebird • Version: 2.5 • Zugriff über: FireDAC
TFDQuery -> Parameter in LIKE-Anweisung führt bei zu großer Länge zu Exception
Moin,
Ich habe eine Suche, die per SQL-Anweisung in mehreren Feldern nach einem Suchbegriff sucht. Um Ärger mit Sonderzeichen etc zu vermeiden, wollte ich diese SQL-Anweisung auf Parametergebrauch umstellen, bin dabei jedoch auf ein Problem gestoßen: Nehmen wir an, es gibt in der Datenbank ein Feld "TEST", was ein VARCHAR(5) ist. Führe ich die SQL-Anweisung
Code:
aus, so liefert das zwar nichts zurück, funktioniert aber problemlos.
SELECT * FROM BLUB WHERE TEST LIKE '%1234567890%'
Mache ich das ganze jedoch so,
Code:
So wird folgender Fehler ausgegeben:
SELECT * FROM BLUB WHERE TEST LIKE :TEST
Query.Params.ParamByName('TEST').DataType := ftString; Query.Params.ParamByName('TEST').AsString := '%1234567890% Zitat:
Code:
, so passiert dasselbe.
SELECT * FROM BLUB WHERE TEST LIKE '%'||:TEST||'%'
Query.Params.ParamByName('TEST').DataType := ftString; Query.Params.ParamByName('TEST').AsString := '1234567890 Setze ich manuell die Size des Parameters, so wird stattdessen diese Fehlermeldung geworfen: Zitat:
Meine Frage daher: Kennt jemand das Problem bzw hat eine Lösung dafür? |
AW: TFDQuery -> Parameter in LIKE-Anweisung führt bei zu großer Länge zu Exception
Wenn das Feld nur 5 Zeichen groß ist, kann ein Vergleichsstring mit 12 Zeichen Länge ja auch nicht gefunde werden.
|
AW: TFDQuery -> Parameter in LIKE-Anweisung führt bei zu großer Länge zu Exception
Moin...:P
Hast du das SQL im QT oder einer Query die auf die Form gepappt ist? Zitat:
|
AW: TFDQuery -> Parameter in LIKE-Anweisung führt bei zu großer Länge zu Exception
Hi
Ich habe mit FDQuery (FireDac) noch nichts gemacht. Aber wenn man vor dem Setzen des Parameter - Wertes ein Prepare macht, dann sollte der Parameter in Size dir korrekte Länge enthalten. Dann könntest du den String ohne zusätzliche Abfrage auf die richtige Größe kürzen. Mache Komponenten (z.B. IBO) generieren auch schon die Feldliste der Query nach dem Prepare. Dann könnte man dor die Länge ermitteln. Frank |
AW: TFDQuery -> Parameter in LIKE-Anweisung führt bei zu großer Länge zu Exception
Hallo,
was soll Dein LIKE eigentlich bringen? Es ergibt doch immer NULL: Meinst Du vielleicht IN ?. PS: Bei String-Länge in FB musst Du halt immer aufpassen, dass die Suchstrings und Ergebnisstrings nicht zu lang sind. |
AW: TFDQuery -> Parameter in LIKE-Anweisung führt bei zu großer Länge zu Exception
Zitat:
Zitat:
Zitat:
Zitat:
|
AW: TFDQuery -> Parameter in LIKE-Anweisung führt bei zu großer Länge zu Exception
Wie sieht den den Query Parameter aus?
Code:
object FDQuery1: TFDQuery
Left = 640 Top = 216 ParamData = < item Name = 'Test' DataType = ftString ParamType = ptInput Size = 12 end> end |
AW: TFDQuery -> Parameter in LIKE-Anweisung führt bei zu großer Länge zu Exception
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab mal schnell getestet...
Delphi-Quellcode:
Im Debugger ist der Size des Param vor dem Open noch 100.
FDQuery2.Prepare;
FDQuery2.Params[0].Size := 100; FDQuery2.Params[0].AsString := '%123456tttttttfff'; FDQuery2.Open; Das Feld bei mir ist 10. Nach dem Open kommt dennoch der Fehler, dass nur 10 erlaubt ist... Hier scheint FireDac restriktiver zu agieren als andere Komponenten. [EDIT] Allerdings ist bei mir FDQuery2.Params[0].Size nach dem Prepare korrekt auf 10 gesetzt. Damit habe ich den Wert, den ich brauche! Folgendes geht bei mir nun:
Delphi-Quellcode:
Frank
procedure TFrmMain.cxButton2Click(Sender: TObject);
begin FDQuery2.Prepare; FDQuery2.Params[0].AsString := Copy('%123456tttttttfff', 1, FDQuery2.Params[0].Size); FDQuery2.Open; end; |
AW: TFDQuery -> Parameter in LIKE-Anweisung führt bei zu großer Länge zu Exception
So, ich habe einen Workaround gefunden, mit dem ich höchstwahrscheinlich gut leben kann:
Ich hole mir die Größe der Stringfelder einfach vorab mittels einer TFDMetaInfoQuery und überspringe die Suchschritte, bei denen das Datenfeld kleiner ist als der Suchbegriff. Damit ist das Problem gelöst und anscheinend sogar Performance gewonnen, da die Query schlanker ist und weniger Parameter gesetzt werden. Ich hatte es vorher nochmal mit dem Prepare versucht, aber irgendwie wollte das bei mir nicht so richtig. Von daher werde ich diese Lösung hier jetzt nochmal bisschen durchtesten, aber soweit scheint es hervorragend zu funktionieren. |
AW: TFDQuery -> Parameter in LIKE-Anweisung führt bei zu großer Länge zu Exception
Zitat:
Code:
Zur Performance kann ich jetzt nichts sagen, die ist aber je nach Ausdruck und Qualität des Query-Optimizers aber eh bescheiden.
SELECT * FROM BLUB WHERE TEST||'' LIKE :TEST
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:45 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-2025 by Thomas Breitkreuz