Delphi String in SQL mit INSERT eintragen: Backslash Problem

koffi

Lt. Junior Grade
Registriert
Jan. 2007
Beiträge
490
gude

ich schreibe zur zeit an einem delphi programm, welches einen dateipfad in eine datenbank eintragen soll, also zum beispiel C:\Programme
soweit funktioniert alles.
der string in delphi, dessen wert später an die datenbank übergeben wird, hat auch tatsächlich den wert 'C:\Programme'. sobald ich diesen string aber mit insert in die datenbank eintragen lasse, erhält die datenbank folgenden neuen wert: C:programme

fazit: sql löscht alle backslashes raus.
immerhin das hab ich durch google erfahren.
die lösung: man muss die backslashes "maskieren", also verdoppeln.

nun meine frage:
gibt es in delphi irgend eine funktion oder so, mit welcher ich automatisch alle backslashes meines strings verdoppeln kann? oder sowas ähnliches? oder andere ideen zur lösung meines problems? oder muss ich jetzt tatsächlich irgend eine prozedur schreiben, welche jedes zeichen meines strings durchläuft, prüft ob es ein backslash ist, ggf ein neues hinzufügt und.. bäh. bloß nicht..

danke im vorraus!
gruß
 
Kommt drauf an welches "SQL" du meinst. Ich bin jetzt kein Delphiprofi aber normalerweise sollte es doch Prepared Statements geben?
 
MySQL-Client-Version: 5.1.37 wenn du das wissen wolltest..
Prepared Statements? hab ich noch nie von gehört.. ich hab zumindest lange nach der existenz von funktionen gegoogelt, welche automatisch backslashes in strings doppeln. nichts gefunden...
 
Na dann guck mal bei google was Prepared Statements sind.
Innerhalb von 5 Minuten bin ich hier gelandet: http://www.audio-data.de/mysql.html und dort ist im StmtDemo-Ordner auch ein Beispiel für Prepared Statements drin. Außerdem bietet dies wohl auch Escapefunktionen (QuoteString) an wenn ich das richtig sehe. Ich würde dir aber trotzdem dazu raten PreparedStatements zu verwenden weil das letztlich ne Menge Stress spart.

Edit: Der Autor dieses Mysql-Bindings (oder was auch immer das ist) ist übrigens hier http://www.delphipraxis.net/post1092795.html
 
Zuletzt bearbeitet:
okay, wenn ich das richtig verstehe, dann muss ich jetzt mit dieser neuen sql.pas meine datenbank verwalten.
jedoch habe ich bereits mysql-units in meinem projekt, mit welchen ich zu meiner datenbank connecte und so. muss ich das jetzt echt alles aufgeben und umbauen, nur um prepared statements zu benutzen?

EDIT

ach woscht. habs letztendlich doch so gelöst wie ich es nicht lösen wollte.. garnicht so kompliziert wie ich dachte.

chosendir ist das der dateipfad. der code verdoppelt also alle backslashes, so dass wenn der string in mysql eingetragen wird, wieder normal (mit einem backslash) angezeigt wird.

Code:
  for i := Length(chosendir) downto 1 do
  begin
       if chosendir[i] = '\' then
        Insert('\', chosendir, i);
  end;
 
Zuletzt bearbeitet:
hätte da nicht einfach nur der Aufruf von StringReplace() ausgereicht?

Code:
sPath := StringReplace('C:\Programme\WhatEver','\', '\\', [rfReplaceAll, rfIgnoreCase]);
 
wahrscheinlich schon, aber auf sowas hätte man mich früher bringen sollen!" :o

danke trotzdem
 
Zurück
Oben