Seite 1 von 1

SQL-Parameterbesetzung in Delphi

Verfasst: Fr 14. Okt 2022, 18:51
von zappa2
Hallo Leute,
ich stolpere jetzt schon mehrmals darüber, dass die Params-Eigenschaft in Delphi irgendwie tricky arbeitet.

Simples Beispiel:

Code: Alles auswählen

select (case
when :i0=2 then iif(octet_length(trim(Feld2))>0, Feld2, Feld22)
when :i0=3 then iif(octet_length(trim(Feld3))>0, Feld3, Feld23)
else iif(octet_length(trim(Feld1))>0, Feld1, Feld11) end)
from Tabl1 where myNr=:i1
Nun mache ich erst ein Prepare, anschließend fülle ich die Params[0].AsInteger und Params[1].AsInteger .
Fehlanzeige.
Sehe ich hier den Wald vor lauter Bäumen nicht? Im IBExpert ist das absolut kein Problem, es werden i0 und i1 abgefragt und sauber verarbeitet.
Ich arbeite mit den Komps von Devart.
Hat evtl. jemand eine Idee, wie ich hier weiter komme?

Ach so: besetze ich die Felder mit ParamByName, funzt es. Ist in meiner abgeleiteten komplexen, universellen SQL-Klasse aber nicht vorgesehen. (Params werden als OpenArrays übergeben und per Index gefüllt, nicht per Name).

Re: SQL-Parameterbesetzung in Delphi

Verfasst: Sa 15. Okt 2022, 10:01
von Groffy
Hallo,

was verstehst Du denn unter "Fehlanzeige"? Werden die Werte nicht korrekt den Parametern zugeordnet, oder gibt es irgendwelche Exceptions? Lass Dir doch mal die Parameternamen [0] und [1] ausgeben.

Gruß Ulrich

Re: SQL-Parameterbesetzung in Delphi

Verfasst: Sa 15. Okt 2022, 18:13
von zappa2
Erst mal danke für Deine Reaktion!

Stimmt, Fehlanzeige ist nicht besonders aussagekräftig.

Ich habe den Eindruck, als ob die DevArt-Komponenten immer dann nicht mit Indices zurechtkommen, wenn Parameter im Select, also vor from stehen.

Es kommt keine Exception, aber er führt die Abfrage nicht richtig aus. Er scheint den Parametern im Select-Zweig die ersten außerhalb des Select-Zweiges zuzuordnen. Also in meinem Beispiel ordnet er dem Parameter i0 real meinen an i1 übergebenen Wert zu, i1 hingegen wird auf NULL gesetzt. Der von mir an i0 übergebene Wert wird ignoriert. Dieses Verhalten lässt sich sowohl mit String- als auch mit Integer-Parametern reproduzieren. Weiter habe ich noch nicht getestet.

Wie schon geschrieben, kommen die DevArts mit einer Zuweisung per ParamByName zurecht.

Re: SQL-Parameterbesetzung in Delphi

Verfasst: Fr 21. Okt 2022, 04:11
von vr2
Hallo zappa2,

One Size Fits All ;-) In diesem Fall nicht. Wenn Du "Param By Index" nutzt, wird jeder Parameter, den Du ins statement setzt, weitergezählt, muss ja, per Definition, egal, ob die alle gleich heißen. Nur mit ParamByName kannst Du mehrfach verwendete gleichnamige Parameter mit einer einzigen Zuweisung bestücken. IBExpert macht grundsätzlich ParamByName, wie es aussieht. Du kriegst dort vermutlich auch 'i0' zum Ausfüllen präsentiert, und nicht Parameter 0.

Grüße, Volker