[Bug?] - TSQLQuery.ParamCheck:=False löscht nicht die Params

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Benutzeravatar
Zvoni
Beiträge: 639
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

[Bug?] - TSQLQuery.ParamCheck:=False löscht nicht die Params

Beitrag von Zvoni »

Mahlzeit.

Bin in folgendes Szenario gerauscht:
DB = SQLite
Ich hab ein TSQLQuery-Objekt, welches ich "wiederverwende" (wie wahrscheinlich wir alle).
Was ich jedes Mal mache:

Code: Alles auswählen

MyQuery.Close;
MyQuery.SQL.Clear;
MyQuery.SQL.Text:=EinSQLStatement;
//Optional setze Parameter mit MyQuery.ParamByName(':pEinParam').AsString:='Irgendwas'; //oder auch Integer oder was auch immer
MyQuery.Open; //Oder ExecSQL;
//Optional: Commit/CommitRetaining;
Heisst:
Ich nutze das Objekt um ein SQL-Statement auszuführen, hole das Ergebnis ab, speicher das irgendwo oder es löst eine Aktion aus.
Ich verwende dasselbe Objekt, um ein weiteres SQL-Statement auszuführen, welches Parameter hat, setze die Parameter und Feuer frei.
Ich verwende WIEDER dasselbe Objekt, setzt aber diesmal als erstes "ParamCheck:=False", da ich im SQL-String zwei Parameter als Literals an die Datenbank senden muss.
(Ist ein CREATE TABLE-Statement)

Beispielhaft:

Code: Alles auswählen

MyQuery.Close;
MyQuery.SQL.Clear;
MyQuery.SQL.Text:=EinSQLStatement;
MyQuery.Open; 
//Mache etwas mit dem Ergebnis

MyQuery.Close;
MyQuery.SQL.Clear;
MyQuery.SQL.Text:=EinSQLStatementMitEinemParametern;
MyQuery.ParamByName(':pEinParam').AsString:='Irgendwas';
MyQuery.Open; 
//Mache etwas mit dem Ergebnis

MyQuery.Close;
MyQuery.ParamCheck:=False; //<-----!!!!!
MyQuery.SQL.Clear;
MyQuery.SQL.Text:=EinSQLStatementMitZweiParameternAlsLiterals;
MyQuery.ExecSQL;   //--> KABUMM!




und genau beim letzten Schritt hats geknallt --> Index out of Bounds

Was ist es gewesen?
Die Params-Auflistung bleibt gecached!
Heisst: Obwohl ich ParamCheck:=False habe, will der Code dennoch Param-Bindings durchführen, weil eben Params.Count>0 ist.
Und in dem Fall hatte ich sogar "Glück" dass es eine unterschiedliche Zahl an Params war im Vergleich zu den Literals im SQL-String.
Ich denke nicht dass ich eine Exception bekommen hätte, wenn die Zahl der gecachten Params gleich gewesen wäre mit der Zahl der Literal-Parameter

Die Lösung war ein explizites

Code: Alles auswählen

MyQuery.Close;
MyQuery.ParamCheck:=False; 
MyQuery.Params.Clear; //<-----!!!!!
MyQuery.SQL.Clear;
MyQuery.SQL.Text:=EinSQLStatementMitZweiParameternAlsLiterals;
MyQuery.ExecSQL;   //--> Kein KABUMM!

Und jetzt die philosophische Frage: Ist das ein Bug?
Ich hätte erwartet, dass wenn ich explizit ein ParamCheck setze, und dabei egal, ob auf False oder True, da ich das True z.B. bei nachfolgenden Aufrufen wieder brauchen würde, die Params gelöscht werden.

Meinungen?

Und ja, ist wirklich so, dass ich "Parameter" als Literals an die DB schicken muss (Pivot-Tabellen-Erstellung)
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
Zvoni
Beiträge: 639
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: [Bug?] - TSQLQuery.ParamCheck:=False löscht nicht die Params

Beitrag von Zvoni »

Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7270
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: [Bug?] - TSQLQuery.ParamCheck:=False löscht nicht die Params

Beitrag von af0815 »

IMHO nicht direkt ein Bug.

Mit ParamCheck stellst du ja nur fest ob er die Parameter parsen soll oder nicht. Nicht daß er explizit dadurch die Parameter löschen soll. Was ist, wenn du die Parameter selbst verwaltest und das Raten der Parameter nicht willst. (Zumindest vermeide ich persönlich das Ratespiel in der SQLdb).

Das explizite Löschen macht für mich Sinn.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Zvoni
Beiträge: 639
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: [Bug?] - TSQLQuery.ParamCheck:=False löscht nicht die Params

Beitrag von Zvoni »

af0815 hat geschrieben: Di 7. Apr 2026, 14:56 IMHO nicht direkt ein Bug.

Mit ParamCheck stellst du ja nur fest ob er die Parameter parsen soll oder nicht. Nicht daß er explizit dadurch die Parameter löschen soll. Was ist, wenn du die Parameter selbst verwaltest und das Raten der Parameter nicht willst. (Zumindest vermeide ich persönlich das Ratespiel in der SQLdb).

Das explizite Löschen macht für mich Sinn.
Eben deshalb bin ich mir da auch nicht ganz schlüssig, wobei es in meinem Fall eben "unnamed" Parameters (Bsp "..WHERE EinFeld=?1 And EinAnderesFeld=?2")
waren, welche ich als Literale an die DB schicken musste, und genau da muss es dann geknallt haben, weil er Params.Count>0 findet, und dann das Binding versucht
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
Zvoni
Beiträge: 639
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: [Bug?] - TSQLQuery.ParamCheck:=False löscht nicht die Params

Beitrag von Zvoni »

hmm... MvC selbst hat mein Proposal angenommen (und scheint daher mit meiner Argumentation einherzugehen),
aber er hats ein wenig anderst gelöst.
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7270
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: [Bug?] - TSQLQuery.ParamCheck:=False löscht nicht die Params

Beitrag von af0815 »

Schau Mal, ob deine Argumente durch gekommen sind. MvC hat da manchmal andere Vorstellungen, wie ich bereits in der Vergangenheit erfahren durfte. :D
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Zvoni
Beiträge: 639
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: [Bug?] - TSQLQuery.ParamCheck:=False löscht nicht die Params

Beitrag von Zvoni »

af0815 hat geschrieben: Di 7. Apr 2026, 16:38 Schau Mal, ob deine Argumente durch gekommen sind. MvC hat da manchmal andere Vorstellungen, wie ich bereits in der Vergangenheit erfahren durfte. :D
Ja, sind durchgekommen.
Er hat das "FParams.Clear" nur an einer anderen Stelle
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Antworten