Insert Into Problem mit Visual C++.



  • Hallo!

    ich möchte mit einer Funktion, der mehrer parameter als String übergeben werden, Daten in eine mySQL Datenbank eintragen. Benutze Visual Studio 2003 und mySQL ODBC Treiber v3.5.

    Hab bisher folgendes geschrieben:

    [code]
    void CV3Dlg::DBInsertTime(CString insertUser, CString insertProjektname,                  CString insertTaetigkeit, CString insertStartzeit, CString Endzeit)
    {
       CString SQLInsert = "INSERT INTO aufwand VALUES ('"+insertUser+"', '"+insertProjektname+"', '"+insertTaetigkeit+"', '"+insertStartzeit+"',
           '"+insertEndzeit+"');
    
       DBConnect(); // Eigene Funktion. 
    
       m_DB.ExecuteSQL(SQLInsert);
    
       DBClose();   // Eigene Funktion. 
    }
    [/code]
    

    Was mache ich falsch? Ich bin schon am verrückt werden. 😡

    Danke schon mal.


  • Mod

    Was ist denn das Problem? Was läuft schief? Compilerfehler? Ausführungsfehler? SQL-Fehler?

    Ich würde mich niemals auf die Reihenfolge der Columns verlassen!
    Ich würde immer auch die Splatennamen mit angeben:
    INSERT INTO titles
    (title_id, title, type, pub_id, price)
    VALUES ('BU9876', 'Creating Web Pages', 'business', '1389', '29.99')



  • Ups, das mit den Spaltennamen seh ich ein. Habs vergessen.

    Hab die Spaltennamen hinzugefügt.

    [code]
    CString SQLInsert = "INSERT INTO aufwand (User,Projekt,Taetigkeit,Start,Ende)
              VALUES ('"+insertUser+"', '"+insertProjektname+"', 
                       '"+insertTaetigkeit+"', '"+insertStartzeit+"', 
                     '"+insertEndzeit+"');
    [/code]
    

    Das Problem ist, zum einen bekomm ich 2 Compilerfehler:

    1. zu viele Konstanten in der Insert Into Anweisung (error C2015) und
    2. einen Syntax Fehler.

    und zum anderen weiss ich nicht genau ob die Variablen übergabe an die Insert Into Anweisung so korrekt ist.



  • Hm, ich glaub es kann an 2 Sachen liegen:
    1. ich glaub auch ' muss man in Strings als \' schreiben
    2.

    "ein Text" + einCString + "noch ein Text"
    

    geht nicht, du musst wenn schon mindestens

    CString("ein Text") + einCString + "noch ein Text"
    

    machen. Weil nur CStrings kennen den Operator + bei normalen Strings vom Typ char* hat der eine völlig andere Bedeutung.
    Und da der Operaor + bei CString soweit ich weiß nicht global ist, musst der erste String ein CString sein

    Wenn's trotzdem nicht geht, ich würde das so machen, das funktioniert zu 1000%:

    CString query;
    query.Format("INSERT INTO aufwand (User,Projekt,Taetigkeit,Start,Ende)"
                 "VALUES (\'%s\', \'%s\', \'%s\', \'%s\', \'%s\')",
                 insertUser, insertProjektname, insertTaetigkeit, insertStartzeit, Endzeit)
    


  • ein Hochkoma muss man nicht escapen.


  • Mod

    Und grundsätzlich sollte man solche Queries als parametrisierte Abfragen stellen, oder zumindest garantieren, dass beim Zusammenbauen der Strings die Hochkommas escaped werden damit keine SQL-Injection möglich wird!


Anmelden zum Antworten