SQLQuery1.ExecSQL: Zuweisung mittels := wirft Fehler aus.

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

SQLQuery1.ExecSQL: Zuweisung mittels := wirft Fehler aus.

Beitrag von DiBo33 »

Hallo,

Code: Alles auswählen

SQLQuery1 := 'SET @var := 1';
try
  SQLQuery1.ExecSQL;
except
  on E: SysUtils.Exception do ShowMessage(E.Message);
end;
Dieser Code liefert mir vom MySQL folgende Fehlermeldung.
Error executing query: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Null= 1' at line 1.
Wie man sieht wird hier der Doppelpunkt durch Null ersetzt und das obwohl ich SQLQuery1.ParseSQL auf false gesetzt habe.
Es scheint also grundsätzlich ein Parsen durchgeführt zu werden.

Wie kann ich dieses Verhalten ändern, meinetwegen das Parsen komplett ausschalten?
Die einzige Quelle welche ich bisher fand, war in der Datei
${LazarusDir}\fpc\2.2.1\source\packages\fcl-db\src\dsparams.inc
jedoch bewirkte hier jegliche Änderung nichts.

Hat hier jemand ein Tipp für mich, wie ich das Verhalten nun ändern kann?

Gruß

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6766
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:

Beitrag von af0815 »

ParseSQL und UsePrimaryKeyAsKey auf false setzen, Statementtype auf stExecProcedure.

Zusätzlich noch die Frage: warum der Doppelpunkt - meines wissens wird von MySQL beim Set NUR das Gleichheitszeichen verwendet (siehe Kapitel 18.2.7.2. Variable SET Statement vom MySQL 5.1 Manual)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Beitrag von DiBo33 »

af0815 hat geschrieben:ParseSQL und UsePrimaryKeyAsKey auf false setzen, Statementtype auf stExecProcedure.
SQLQuery1.StatementType := stExecProcedure;
Gibt den Fehler:
Error: No member is provided to access property
ist also ReadOnly.

Ansonsten bleibt der Fehler auch mit UsePrimaryKeyAsKey := false.
af0815 hat geschrieben:Zusätzlich noch die Frage: warum der Doppelpunkt - meines wissens wird von MySQL beim Set NUR das Gleichheitszeichen verwendet (siehe Kapitel 18.2.7.2. Variable SET Statement vom MySQL 5.1 Manual)
Das ist fast richtig, du kannst auch eine Zuweisung mittels := machen.
Bei einem SET hat das wenig Auswirkungen, aber innerhalb eines Selects ist es ein Unterschied ob die Zuweisung mittels = oder mittels := geschieht.

Bsp: http://dibo.dklmedien.com/km_rechner.php" onclick="window.open(this.href);return false;
hier würdest du bei einer Zuweisung mittels = ein komplett anderes Ergebnis bekommen.

Ich hatte hier lediglich die Problematik aufs wesentliche reduziert.

Gruß

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6766
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:

Beitrag von af0815 »

DiBo33 hat geschrieben: Bsp: http://dibo.dklmedien.com/km_rechner.php" onclick="window.open(this.href);return false;
hier würdest du bei einer Zuweisung mittels = ein komplett anderes Ergebnis bekommen.

Ich hatte hier lediglich die Problematik aufs wesentliche reduziert.
Es geht auch nicht, wenn du es innerhalb eines Select-Statements so verwendest ? Ich würde einmal auf den Doppelpunkt innerhalb des SET Statements verzichten.

Das Problem ist die eingebaute Erkennung der Variablen, da diese normalerweise im einem Doppelpunkt beginnen. Ev. mit doppelten Doppelpunkt escapen (::=)

Zumindest ist das Kapitel 7.4 recht Aufschlussreich für mich.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Beitrag von DiBo33 »

af0815 hat geschrieben:Es geht auch nicht, wenn du es innerhalb eines Select-Statements so verwendest ?
Richtig, genau das ist die ganze Problematik.
af0815 hat geschrieben:Ich würde einmal auf den Doppelpunkt innerhalb des SET Statements verzichten.
Wie gesagt, das Beispiel war nur zu Reduzierung auf das Problem gedacht.
af0815 hat geschrieben:Das Problem ist die eingebaute Erkennung der Variablen, da diese normalerweise im einem Doppelpunkt beginnen. Ev. mit doppelten Doppelpunkt escapen (::=)
Genau um diese Erkennung geht es mir, diese will ich abschalten, mit einem doppelten Doppelpunkt hatte ich es schon versucht, dann wird zwar nicht "geparst" aber MySQL bringt dann den Fehler
... use near '::= 1' at line 1
Wie gesagt, um das SET geht es nicht, sondern einzig und allein um :=, es muß also irgendwie möglich sein die Query quasi im Raw-Modus abzusetzen ohne das vorher irgend ein Parser dazwischen funkt.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6766
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:

Beitrag von af0815 »

Es schaut in der implementation schlecht aus. Was da fehlt ist eine Methode, wie man den Doppelpunkt escapen kann.

Aber in der dsparams.inc müsste man das schon patchen können. Da das aber zum FPC gehört reicht ein einfaches Recompile nicht aus. Da hat Christian sicher mehr Erfahrung.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Beitrag von DiBo33 »

af0815 hat geschrieben:Aber in der dsparams.inc müsste man das schon patchen können. Da das aber zum FPC gehört reicht ein einfaches Recompile nicht aus. Da hat Christian sicher mehr Erfahrung.
Ja die dsparams.inc hatte ich schon versucht zu patchen und danach jeweils ein komplettes Clean&Build veranstaltet, aber entweder reichte das nicht aus oder es ist einfach die falsche Stelle.

_ny
Beiträge: 40
Registriert: Do 18. Okt 2007, 13:40

Beitrag von _ny »

Du benutzt nicht Zeos als Zugriff auf deinen SQL-Server? Dort funktioniert das nämlich ohne Probleme. Jedenfalls im aktuellen Release...

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6766
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:

Beitrag von af0815 »

_ny hat geschrieben:Du benutzt nicht Zeos als Zugriff auf deinen SQL-Server? Dort funktioniert das nämlich ohne Probleme. Jedenfalls im aktuellen Release...
Was zu patchen ist, ist jetzt klar, auch der Code dazu ist ein 4-Zeiler. (Und somit auch ein Patch möglich). Momentan ist eher das wie 'kompilieren' das Problem, da es weder zu Lazarus noch zur LCL gehört, sondern zum FPC.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Beitrag von DiBo33 »

Ok, ich habe es hinbekommen.

In der dsparams.inc einfach die Zeile 291 von

Code: Alles auswählen

if p^=':' then
ändern auf

Code: Alles auswählen

if (p^=':') or (p^='=') then
Dann wird zwar weiterhin geparst, aber ein := wird genauso wie :: ignoriert.
Danach muß in fpc\2.2.1\source\packages\fcl-db\units\i386-win32\ alle .o und .ppu Dateien gelöscht werden und mit make neu erstellt werden.
Die neuen Dateien dann nach fpc\2.2.1\units\i386-win32\fcl-db\ kopieren und zum Schluß Lazarus neu erstellen.

Jetzt muß ich nur noch sehen, wie ich das den Entwicklern von FP zukommen lasse.

@_ny, nein ich nutze die Standardkomponenten von Lazarus.

Gruß

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6766
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:

Beitrag von af0815 »

Gratuliere, die Lösung im Code ist ja leichter als das recompile zu erzwingen :-)
DiBo33 hat geschrieben: Jetzt muß ich nur noch sehen, wie ich das den Entwicklern von FP zukommen lasse.
SVN oder Downloadversion ?

Wenn du willst kann ich daraus eine Patch machen, da ich mit dem SVN arbeite. Der normale Vorgang ist das über den Bugtracker und dem Upload des Patches. Wobei hier aber wahrscheinlich die Beschreibung schon genug ist.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Beitrag von DiBo33 »

Kannst du gerne machen, ich hatte es an Marc geschickt und das Ergebnis:
> Hello,
>
> With Standard-Components from Lazarus SQLQuery will not accept := for MySQL and MsSQL-Statements.
>
> I will change the File fpc\2.2.1\source\packages\fcl-db\src\dsparams.inc Line 291
>
> 291c291
> ---
> > if (p^=':') or (p^='=') then // ignore ::, since some databases uses this as a cast (wb 4813)
> SQLQuery now will accept := for Statements on MySQL and MsSql.
>
> This is a FPC File i hope you can change this.

I can, but I will hand over this kind of things to the fpc team. This kind of DB related issues are usually handled by Michael or Joost.
However, I will forward it.

Thanks, Marc

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Beitrag von DiBo33 »

Sorry, mein Englisch ist doch etwas zu bescheiden, kann mir jemand das mal übersetzen?
Applied. Had to change the patch, though, because it wouldn't apply.
Made it also slightly more concise.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6766
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:

Beitrag von af0815 »

Angewendet. Ich mußte den Patch ändern, da er sich nicht anwenden ließ.
Mache ihn ein wenig präziser.

Super, damit ist es im nächsten SVN drinnen :-)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten