Anführungszeichen beim INSERT INTO in eine FoxPro dbf-Datei



  • Mal wieder ich. Hoffe einer von euch kann mir weiterhelfen.

    Folgende Situation:
    Ich möchte ein INSERT INTO Statement (die Datein dafür lese ich mir zuvor aus einer SQL-Server-Datenbank) auf eine VoxPro dbf-Datei absetzen. Dabei werden Werte für Zeichen-Felder (Datentyp) mit Anführungszeichen umschlossen und z.B. Dezimal-Felder ohne Anführungszeichen. Das sieht dann ungefähr so aus (Zusammensetzung des INSERT INTO Statements):

    l_statement = "INSERT INTO" + tableA + " (kd_zeichen, kd_name, kd_zahl) ";
    l_statement += "VALUES (";
    l_statement += "\"" + l_kunden_zeichen + "\",";
    l_statement += "\"" + l_kunden_name + "\",";
    l_statement += l_kunden_anzahl + ")";
    

    Das abzusetzende Statement lautet dann also:

    INSERT INTO kunden_tabelle (kd_zeichen, kd_name, kd_zahl) VALUES ("AFG","Thomsen AG",23);
    

    Soweit so gut.
    Problem entsteht nur, wenn bei einem der Werte Anführungszeichen vorhanden sind. Wenn der Kunde also nicht Thomsen AG sondern Th"omsen AG heißen würde. Dann wird das Anführungszeichen nämlich als Beenden des Tags angesehen und schon hab ich nen Problem.

    Wie kann ich das umgehen?
    Mit Perl hab ich es damals irgendwie gelöst, indem ich die Variablen erst beim direkten Datenbankzugriff eingefügt habe, meine ich. Aber bei C++!??!

    Absetzen tu ich das Statement mittels:

    datasession.OpenWithServiceComponents("MSDASQL.1", &dbinit);
    session.Open(datasession);
    ...
    HRESULT tmp = rs.Open(session, l_statement, &propset, NULL, DBGUID_DBSQL, FALSE);
    rs.Close();
    session.Close();
    datasession.Close();
    

    Einer nen Lösungsansatz parat?



  • Du kannst parametriesierte Statements verwenden. Das sollte das Problem lösen.



  • Oder escapen.



  • Escapen hatte ich auch schon gedacht und werde es morgen mal versuchen.

    Aber was meinste du, Joe, mit parametriesierte Statements?
    Beispiel? Code-Schnipsel?



  • Nun ja, SQL-Statements in denen Parameter verwendet werden. 😉

    INSERT INTO Tabelle (Feld1, Feld2, Feld3)
    VALUES (:ParameterFeld1, :ParameterFeld2, :ParameterFeld3)
    

    Die Parmeter müssen dann noch vom Programm aus übergeben werden.



  • Hey, das klingt gut.

    Hab es jetzt vorerst so gelöst, dass ich erstens die String-Werte für Zeichenfelder in Hochkomma übergebe, aus FoxPro heraus gehts nicht, aber aus meinem Prog heraus schon ... komisch, und zweitens alle Hochkomma in den Werten werden durch doppelte Hochkomma ersetzt. Sozusagen nen Escape ohne Standard-Backslash. Funzt jedenfalls.

    Danke allen und den Parameter-Tipp werde ich noch mal verfolgen.


Anmelden zum Antworten