Hochkomma in Strings bei MySQL-Abfrage?

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

Steffan
****
Beiträge: 125
Registriert: Mi, 21.06.2006 10:07
Wohnort: Dresden

Hochkomma in Strings bei MySQL-Abfrage?

Beitrag von Steffan »

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.
Hurby
**
Beiträge: 46
Registriert: Di, 30.08.2005 10:40

Beitrag von Hurby »

Hallo,

bin zwar auch nicht so involviert, aber grundsätzlich musst du den ASCII-Code angeben. In VBA oder VB wäre das chr(39). Wie gesagt bin auch neu in OpenOffice...

MfG Hurby
Steffan
****
Beiträge: 125
Registriert: Mi, 21.06.2006 10:07
Wohnort: Dresden

Beitrag von 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):

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
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
Hurby
**
Beiträge: 46
Registriert: Di, 30.08.2005 10:40

Beitrag von Hurby »

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.

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
sollte klappen...

MfG Hurby
Mihilist
****
Beiträge: 120
Registriert: Di, 25.04.2006 15:27
Wohnort: Nürnberg
Kontaktdaten:

Beitrag von Mihilist »

Hurby hat geschrieben:Deine Entwicklungsumgebung erkennt die Simikolons als Start oder Endemarke einer Zeichenkette.
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:

msgbox "Gibt ""dies"" einen Fehler...?"

;)
Hurby
**
Beiträge: 46
Registriert: Di, 30.08.2005 10:40

Beitrag von Hurby »

Hast ja recht, gibt keinen Fehler, durch das Doppel-zeichen. Hatte ich ganz vergessen...

Mfg Hurby
Steffan
****
Beiträge: 125
Registriert: Mi, 21.06.2006 10:07
Wohnort: Dresden

Beitrag von Steffan »

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.

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
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.
Mihilist
****
Beiträge: 120
Registriert: Di, 25.04.2006 15:27
Wohnort: Nürnberg
Kontaktdaten:

Beitrag von Mihilist »

Probier mal den ursprünglichen Code:
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
Aber anstatt .executeQuery(String) nimm .executeUpdate(String)

OOo macht da einen Unterschied, ob du ein Query (SELECT-Abfrage) oder was anderes machen willst... Für alles andre nimm executeUpdate ;)
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

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:

Code: Alles auswählen

...title = 'Wohngebiet \'XYZ\''...
(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
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Steffan
****
Beiträge: 125
Registriert: Mi, 21.06.2006 10:07
Wohnort: Dresden

Beitrag von Steffan »

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
Mihilist
****
Beiträge: 120
Registriert: Di, 25.04.2006 15:27
Wohnort: Nürnberg
Kontaktdaten:

Beitrag von Mihilist »

Steffan hat geschrieben:@Mihilist:
Auch Dir vielen Dank! Du hast nämlich ein anderes Problem von mir gelöst.
Da bin ich ja froh... Hab hinterher nochmal nachgesehen, was eigentlich dein Problem war, und gemerkt, dass meine Antwort so absolut überhaupt garnix damit zu tun hatte... :oops:
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Stefan,
Gibt es noch weitere Zeichen die so maskiert werden müssen, damit es keine Probleme bei der Weiterverarbeitung in mySQL gibt?
Na ja, jede Menge. Die MySQL Escape-Zeichen! Als da wären:
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
Antworten