' in einem SQL Ausdruck



  • Hallo,

    ich schreib mir gerade eine kleine MovieDB, leider steh ich nun vor einem Problem:
    Wenn ich einen Film wie:
    "Acidmrp's Urlaub 2004" in eine Tabelle einfügen will kommt verständlicherweise
    erstmal ein Fehler wegen dem '

    Nun hab ich folgedes gemacht (auch aus Sicherheitsgründen):

    AnsiString __fastcall CDatabase::Unquote(AnsiString sString)
    {
        AnsiString sReturn = "";
        for (int i = 0; i < sString.Length(); i++) {
            if (sString.c_str()[i] == '\''
             || sString.c_str()[i] == '\\') {
                sReturn = sReturn + "\\";
             }
             sReturn = sReturn + sString.c_str()[i];
        }
        return sReturn;
    }
    

    raus kommt folgendes String: "Acidmrp\'s Urlaub 2004" und den kann ich immer
    noch nicht in die Tabelle schreiben:

    Benachrichtigung über Debugger-Exception:
    Im Projetkt ... ist eine Exception der Klasse EOleException aufgetreten. Meldung:
    'Syntaxfehler (fehlender Operator) in
    Abfrageausdruck 'Name='Acidmrp\'s Urlaub 2004';''.

    Was hab ich falsch gemacht?



  • Ich vermute mal, die hast den \ intern als \\ dargestellt, so dass die Escape-Sequenz nicht mehr auf das Hochkomma reagiert, sondern einfach auf den darauf folgenden Backslash...



  • das hab ich auch überlegt, aber wie kann ich das anders machen?



  • Acidmrp schrieb:

    Wenn ich einen Film wie: "Acidmrp's Urlaub 2004" in eine Tabelle einfügen will kommt verständlicherweise erstmal ein Fehler wegen dem '
    [...]
    Was hab ich falsch gemacht?

    Du hast einen überflüssigen Apostroph eingefügt.
    Ausserdem: Rettet des Genitivs!

    😉

    Von diesen grundsätzlichen Problemen mal abgesehen wäre es hilfreich, den konkreten Code zu sehen, mit dem du in die DB schreibst, inklusive der "Befüllung" der Variablen.



  • in diesem Fall ist es sogar nur eine Überprüfung ob ein Eintrag schon existiert:

    bool __fastcall CDatabase::exists(AnsiString strTable, AnsiString strValueName, AnsiString strValue)
    {
        // schaut nach ob ein Wert in einer Tabelle schon existiert
    
        bool bReturn = false;
    
        try {
            ADOQuery->Close();
            ADOQuery->SQL->Clear();
            ADOQuery->SQL->Add("SELECT * FROM " + strTable);
            ADOQuery->SQL->Add("WHERE " + strValueName + "='" + strValue + "';");
            ADOQuery->Open();
    
            bReturn = ADOQuery->RecordCount >= 1;
    
            ADOQuery->Close();
        } catch (...) {
        }
    
        return bReturn;
    }
    

    Dieser Aufruf crasht bei:
    exists("MeineTabelle", "MeineWerte", "Test: '");



  • Verdopplung des Hochkommas hilft hier normalerweise.
    Dafür gibt's verschiedene Wege. Es gibt eine Funktion, die Hochkommas autoamtisch verdoppelt
    (QuotedString oder so ähnlich) oder aber Du verwendest ein parametrisiertes Query.
    Oder Du machst alles selbst.

    Gruß,

    Alexander



  • Alexander Kempf schrieb:

    Es gibt eine Funktion, die Hochkommas autoamtisch verdoppelt
    (QuotedString oder so ähnlich)

    QuotedStr()

    bis bald
    akari



  • mit QuotedStr() klappts. Danke an alle!


Anmelden zum Antworten