SQL-Parameterbesetzung in Delphi

Themen rund um den praktischen Einsatz von Firebird. Fragen zu SQL, Performance, Datenbankstrukturen, etc.

Moderator: thorben.braun

Antworten
zappa2
Beiträge: 31
Registriert: Fr 5. Okt 2018, 10:59

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).
Groffy
Beiträge: 78
Registriert: Do 12. Apr 2018, 23:14

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
zappa2
Beiträge: 31
Registriert: Fr 5. Okt 2018, 10:59

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.
vr2
Beiträge: 214
Registriert: Fr 13. Apr 2018, 00:13

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
Antworten