Einzelnen Beitrag anzeigen

AuronTLG

Registriert seit: 2. Mai 2018
Ort: Marburg
291 Beiträge
 
Delphi 12 Athens
 
#1

TFDQuery -> Parameter in LIKE-Anweisung führt bei zu großer Länge zu Exception

  Alt 24. Feb 2020, 11:27
Datenbank: Firebird • Version: 2.5 • Zugriff über: FireDAC
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:
SELECT * FROM BLUB WHERE TEST LIKE '%1234567890%'
aus, so liefert das zwar nichts zurück, funktioniert aber problemlos.

Mache ich das ganze jedoch so,

Code:
SELECT * FROM BLUB WHERE TEST LIKE :TEST
Query.Params.ParamByName('TEST').DataType := ftString;
Query.Params.ParamByName('TEST').AsString := '%1234567890%
So wird folgender Fehler ausgegeben:

Zitat:
[FireDAC][Phys][FB]-345. Daten zu groß Variable [TEST]. Maximale Länge = [5], tatsächliche Länge = [12] Hinweis: Setzen sie TFDParam.Size auf einen größeren Wert
Mache ich das Ganze so,

Code:
SELECT * FROM BLUB WHERE TEST LIKE '%'||:TEST||'%'
Query.Params.ParamByName('TEST').DataType := ftString;
Query.Params.ParamByName('TEST').AsString := '1234567890
, so passiert dasselbe.

Setze ich manuell die Size des Parameters, so wird stattdessen diese Fehlermeldung geworfen:

Zitat:
[FireDAC][Phys][FB]Dynamic SQL Error SQL error code = -303
arithmetic exception, numeric overflow, or string truncation string right truncation
Es gäbe einen Workaround, nämlich per Copy den Parameter nur mit der maximalen Länge des Feldes zu besetzen, doch das würde ich gerne vermeiden, da ich zum Auslesen der Datenfeldgröße nämlich eine offene Query bräuchte, welche unnötig Rechenzeit frisst.

Meine Frage daher: Kennt jemand das Problem bzw hat eine Lösung dafür?
  Mit Zitat antworten Zitat