Hochkomma in Strings bei MySQL-Abfrage?
Moderator: Moderatoren
Hochkomma in Strings bei MySQL-Abfrage?
Hallo zusammen,
ich habe folgendes Problem:
Ausgangspunkt: Datenbank MySQL mit mehreren Tabellen, Verwaltung und Eingabe läuft komplett über Formulare mit diversen Makros.
Jetzt kam ein Anwender auf die Idee bei einem neuen Datensatz in einem Feld u.a ein Hochkomma (') einzugeben (in dem Fall: Wohngebiet 'XYZ') . Daraufhin wird mein SQL-Query natürlich durcheinandertgewirbelt, da das Hochkomma von MySQL als Stringbegrenzung verwendet wird.
Hat jemand dafür eine elegante Lösung?
Danke im Vorraus,
Steffan.
ich habe folgendes Problem:
Ausgangspunkt: Datenbank MySQL mit mehreren Tabellen, Verwaltung und Eingabe läuft komplett über Formulare mit diversen Makros.
Jetzt kam ein Anwender auf die Idee bei einem neuen Datensatz in einem Feld u.a ein Hochkomma (') einzugeben (in dem Fall: Wohngebiet 'XYZ') . Daraufhin wird mein SQL-Query natürlich durcheinandertgewirbelt, da das Hochkomma von MySQL als Stringbegrenzung verwendet wird.
Hat jemand dafür eine elegante Lösung?
Danke im Vorraus,
Steffan.
Hallo Hurby,
ich verstehe dich nicht ganz. Warum muss ich grundsätzlich den ASCI-Code verwenden?
Normalerweise lese ich aus einem Dialog Textfelder ein und baue daraus meinen SQL-Befehl, was bisher so immer geklappt hat. Im konkreten Fall sieht das allerdings so aus (SQL-Befehl vereinfacht):
Hier wird das vom Anwender eingegebene Hochkomma vor XYZ als Ende des Strings interpretiert und der Fehler tritt dann in der Zeile der Ausführung (oResult.ExecuteQuery), also bei der Verarbeitung durch mySQL auf.
Steffan
ich verstehe dich nicht ganz. Warum muss ich grundsätzlich den ASCI-Code verwenden?
Normalerweise lese ich aus einem Dialog Textfelder ein und baue daraus meinen SQL-Befehl, was bisher so immer geklappt hat. Im konkreten Fall sieht das allerdings so aus (SQL-Befehl vereinfacht):
Code: Alles auswählen
sQuery="UPDATE projects SET number = '20055', title = 'Wohngebiet 'XYZ', country = ... "
oStat = oConn.createStatement()
' on error resume next
oResult=oStat.ExecuteQuery(sQuery)
on error goto 0
Steffan
Du musst nur den ASCII-Code nur angeben, bei Zeichen, die deine IDE anders inderpretiert. Deine Entwicklungsumgebung erkennt die Simikolons als Start oder Endemarke einer Zeichenkette. Wenn Du jetzt den ASCII-Code angibst wird das erst beim Compilieren und Linken aufgelöst und ergibt keinen Fehler.
sollte klappen...
MfG Hurby
Code: Alles auswählen
sQuery="UPDATE projects SET number = '20055', title = 'Wohngebiet ' & chr(39) & 'XYZ', country = ... "
oStat = oConn.createStatement()
' on error resume next
oResult=oStat.ExecuteQuery(sQuery)
on error goto 0
MfG Hurby
Nö, tut's nicht. Basic interpretiert Gänsefüßchen (Shift-2) als Start und Ende einer Zeichenkette, nicht Semikolons (Shift-#). Im Übrigen kann man auch Strings mit Gänsefüßchen bauen:Hurby hat geschrieben:Deine Entwicklungsumgebung erkennt die Simikolons als Start oder Endemarke einer Zeichenkette.
msgbox "Gibt ""dies"" einen Fehler...?"

Hallo zusammen,
also das klappt so nicht.
ich habe in meinen Einzelfeldern vor Zusammensetzung des SQL-Befehlsstring die Hochkommas durch chr(39) ersetzen lassen und bekomme den gleichen Fehler.
Problem scheint mir zu sein, dass Hochkomma und chr(39) ja das Gleiche sind und mySQl dann bei der Verarbeitung keinen Unterschied sieht. Wie schon gesagt StarBasic hat damit kein Problem, erst bei der Abarbeitung durch mySQL (executeQuery) tritt der Fehler auf (You have an error in your SQL-Syntax).
Einzige Lösung die mir dazu einfällt, ist Hochkommata als Feldeintrag zu verbieten, aber vielleicht habt ihr ja doch noch eine andere Idee.
Steffan.
also das klappt so nicht.
ich habe in meinen Einzelfeldern vor Zusammensetzung des SQL-Befehlsstring die Hochkommas durch chr(39) ersetzen lassen und bekomme den gleichen Fehler.
Code: Alles auswählen
...
for i = 2 to 12
sEntry(i)=DoReplace(sEntry(i),"'", chr(39))
next i
...
private Function DoReplace(sText as String, sIn as string, sOut as string) as string
sOld=sText
for j= 1 to len(sText)
if mid(sText,j,1)= sIn then
mid(sText,j,1,sOut)
' msgbox "Alt:" & chr(9) & sOld & chr(13) & "Neu:" & chr(9) & sText,0,"Text geändert"
endif
next j
DoReplace=sText
End Function
Einzige Lösung die mir dazu einfällt, ist Hochkommata als Feldeintrag zu verbieten, aber vielleicht habt ihr ja doch noch eine andere Idee.
Steffan.
Probier mal den ursprünglichen Code:
OOo macht da einen Unterschied, ob du ein Query (SELECT-Abfrage) oder was anderes machen willst... Für alles andre nimm executeUpdate
Aber anstatt .executeQuery(String) nimm .executeUpdate(String)Steffan hat geschrieben:Code: Alles auswählen
sQuery="UPDATE projects SET number = '20055', title = 'Wohngebiet 'XYZ', country = ... " oStat = oConn.createStatement() ' on error resume next oResult=oStat.ExecuteQuery(sQuery) on error goto 0
OOo macht da einen Unterschied, ob du ein Query (SELECT-Abfrage) oder was anderes machen willst... Für alles andre nimm executeUpdate

Hey Steffan,
wenn du bei MySQL einen String mit einfachen Hochzeichen übergeben willst, so muss diese "maskiert" werden. Dazu benutzt du bei MySQL den Bachslash (\) als Escape-Sequenz.
Dein String müsste dann lauten:(am Ende zwei einzelne Hochzeichen!)
Wenn du das nicht gleich so eingibst (in die Felder), dann musst du das mit Basic "ersetzen". Also im Grunde mit deinem Code, nur suchst du nach dem Hochzeichen und ersetzt es mit \' - fertig
Sollte funktionieren.
Gruss
Thomas
wenn du bei MySQL einen String mit einfachen Hochzeichen übergeben willst, so muss diese "maskiert" werden. Dazu benutzt du bei MySQL den Bachslash (\) als Escape-Sequenz.
Dein String müsste dann lauten:
Code: Alles auswählen
...title = 'Wohngebiet \'XYZ\''...
Wenn du das nicht gleich so eingibst (in die Felder), dann musst du das mit Basic "ersetzen". Also im Grunde mit deinem Code, nur suchst du nach dem Hochzeichen und ersetzt es mit \' - fertig

Sollte funktionieren.
Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Hallo,
@Thomas
Genau das wars! Nachdem ich meine Funktion DoReplace geändert habe funktionioert es jetzt. Vielen Dank! Gibt es noch weitere Zeichen die so maskiert werden müssen, damit es keine Probleme bei der Weiterverarbeitung in mySQL gibt?
@Mihilist:
Auch Dir vielen Dank! Du hast nämlich ein anderes Problem von mir gelöst. Da ich bisher immer .ExecuteQuery() verwendet habe, wurde der SQL-Befehl zwar ausgeführt, ich bekam aber immer die Meldung "No ResultSet was Produced", die ich dann durch On Error ... abfangen musste.
Steffan
@Thomas
Genau das wars! Nachdem ich meine Funktion DoReplace geändert habe funktionioert es jetzt. Vielen Dank! Gibt es noch weitere Zeichen die so maskiert werden müssen, damit es keine Probleme bei der Weiterverarbeitung in mySQL gibt?
@Mihilist:
Auch Dir vielen Dank! Du hast nämlich ein anderes Problem von mir gelöst. Da ich bisher immer .ExecuteQuery() verwendet habe, wurde der SQL-Befehl zwar ausgeführt, ich bekam aber immer die Meldung "No ResultSet was Produced", die ich dann durch On Error ... abfangen musste.
Steffan
Hey Stefan,
0 (ASCII 0 - NULL), ', ", backspace (\b), neue Zeile (\n), carriage return (\r), Tabulator (\t), ASCII 26 (\z) , Backslash (\\), das Prozentzeichen (\%) und der Unterstrich (\_)
Inwieweit das aber alles bei dir zutrifft, musst du selbst entscheiden
Gruss
Thomas
Na ja, jede Menge. Die MySQL Escape-Zeichen! Als da wären:Gibt es noch weitere Zeichen die so maskiert werden müssen, damit es keine Probleme bei der Weiterverarbeitung in mySQL gibt?
0 (ASCII 0 - NULL), ', ", backspace (\b), neue Zeile (\n), carriage return (\r), Tabulator (\t), ASCII 26 (\z) , Backslash (\\), das Prozentzeichen (\%) und der Unterstrich (\_)
Inwieweit das aber alles bei dir zutrifft, musst du selbst entscheiden

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic