[gelöst] Hochkomma in SQL-String

15. Juli 2020 15:05

Hallo,

über
....
ADOMySQLCommand.CommandText := 'INSERT INTO t_abc VALUES(NULL,'''+ t1."Nachname" + ''',''' + t1."Adresse" + ''')';
...
schreibe ich einen Datensatz in eine externe MySQL-Datenbank. Funktioniert problemlos.
ABER: wenn im Feld t1."Nachname" in Hochkomma ' enthalten ist (zB "von Tester'ische Verwaltung") , dann zerlegt es mir den SQL-String. Der ADOMySQLCommand.ExecuteNonQuery interpretiert den Eintrag als Steuerzeichen und nicht als Teil der Variablen.
Wie kann das verhindert werden?

Danke!
Grüße
Ralph
Zuletzt geändert von Ralph71 am 16. Juli 2020 10:33, insgesamt 1-mal geändert.

Re: Hochkomma in SQL-String

15. Juli 2020 16:20

Du musst scheinbar vor dem Hochkomma ein Backslash (als sog. Escapezeichen) einfügen: https://dev.mysql.com/doc/refman/8.0/en ... erals.html
Übergebe also nicht direkt t1."Nachname".

Re: Hochkomma in SQL-String

15. Juli 2020 16:25

https://navision24.de/funktionen/string/delchr.html

Re: Hochkomma in SQL-String

15. Juli 2020 16:29

Hallo,
Natalie hat geschrieben:Du musst scheinbar vor dem Hochkomma ein Backslash (als sog. Escapezeichen) einfügen


Eigentlich erwartet SQL das genauso wie NAV mit zwei mal '

Du musst dir also eine Funktion bauen, die aus allen einfachen ' zwei ' - einzelne Anführungsstriche macht.

DELCHR ist nicht unbedingt die Lösung, wenn das Zeichen gebraucht wird. :wink:

Gruß Fiddi

Re: Hochkomma in SQL-String

16. Juli 2020 07:06

Und wehe einer nennt seine Firma ';DROP Table t_abc ...

Versuch mal:

Code:
QUOTENAME(' + t1."Nachname" + ', CHAR(39))


Quelle

fiddi hat geschrieben:...DELCHR ist nicht unbedingt die Lösung, wenn das Zeichen gebraucht wird. :wink: ...

Brauchen wird überwertet... Es kommt immer darauf an, was mit den Daten gemacht wird. :mrgreen:

Re: Hochkomma in SQL-String

16. Juli 2020 07:41

fiddi hat geschrieben:Eigentlich erwartet SQL das genauso wie NAV mit zwei mal '

Funktioniert MySQL nicht in manchen Dingen etwas anders? (wirklich offene Frage, habe damit nie gearbeitet)

Re: Hochkomma in SQL-String

16. Juli 2020 08:08

@Natalie,

MySQL sollte beides können.

Was das ganze nicht unbedingt einfacher macht, weil du auch alle "\?"- Zeichenkombinationen überprüfen musst.

Gruß Fiddi

Re: Hochkomma in SQL-String

16. Juli 2020 08:15

Natalie hat geschrieben:Funktioniert MySQL nicht in manchen Dingen etwas anders?

Dann vergiss was ich geschrieben habe.

Re: Hochkomma in SQL-String

16. Juli 2020 08:26

MySQL kann QUOTENAME nicht....
habs jetzt auf "konventionelle" Art versucht:

...
locCheckNachname:= StrPos(t1.Nachname,''');
IF locCheckNachname >0 THEN BEGIN

und dann weiter mit "Du musst scheinbar vor dem Hochkomma ein Backslash (als sog. Escapezeichen) einfügen"
...

Frage: Wie kann ich denn ein ' übergeben bzw mit StrPos nach diesem suchen?

Re: Hochkomma in SQL-String

16. Juli 2020 08:36

Hallo

PseudoCode:
Code:
function QUOTENAME(str:Text)result :Text
VAR i:integer
BEGIN
  for i:=1 to STRLEN(str) do
    if(str[i]) ='''' then
      result +=''''''
    else
      if (str[i] '\') then
         result +='\\'
      else
        result += COPYSTR(str,i,1);
END;


Gruß Fiddi

Re: Hochkomma in SQL-String

16. Juli 2020 10:33

Danke für die konstruktive Hilfe!
@Natalie --> Korrekt. Der \ bringt die Lösung.

Lösung:
Code:
       locCheckNachname:= STRPOS(t1.Nachname,'''');
       IF locCheckNachname >0  THEN BEGIN //Zeichen ' gefunden

         locNachname := ReplaceString(t1.Nachname,'''','\''');
       
       END ELSE BEGIN;
         locNachname := t1.Nachname;
       END;


Code:
LOCAL ReplaceString(String : Text;FindWhat : Text;ReplaceWith : Text) NewString : Text
FindPos := STRPOS(String,FindWhat);
WHILE FindPos > 0 DO BEGIN
  NewString += DELSTR(String,FindPos) + ReplaceWith;
  String := COPYSTR(String,FindPos + STRLEN(FindWhat));
  FindPos := STRPOS(String,FindWhat); 
END;
NewString += String;