Dickes Problem mit CRecordset daten in Datenbank schreiben!



  • Hallo

    Ich habe folgendes Problem.

    -Habe ein Dialog erstellt
    -CDatabase erstellt
    -CRecordset erstellt
    -Kann mit CRecodset daten auslesen

    Nun mein Problem: Das einlesen klappt nicht. Ich kann keine neuen Datensatz schreiben. Ich weiß auch wo dran das liegt und zwar habe ich die DoFiledExchange funktion in meinen eigenen klasse nicht 😞 Also werden auch nicht die felder dem CRecordset übergeben. Gibt es auch ne andere möglichkeit das zu schrieben? Beim auslesen kann ich das doch auch mit GetFiledValue gibt es so was auch für das scheiben also quasi setFielValue oder so was?

    Wäre mir echt sehr hlfreich!

    MFG

    Jens



  • du kannst mit CDatababase SQL-Statements absetzen. Also auch UPDATE und INSERT 🙂



  • und wie 🙂

    Ich meine wie heißt die Funktion?



  • CDatabase::ExecuteSQL, siehe MSDN o_O



  • Standartmäßig so:
    m_pSet->m_pDatabase->ExecuteSQL();

    Achtung hier gehen keine SELECT Anweisungen



  • db.ExecuteSQL("INSERT INTO Artikel (Beschreibung)VALUES (m_beschreibung)");
    

    das ist der Codeteil

    Aber es kommt ein fehler: 1 Paramter wurde erwarted aber es wurden zu wenig Parameter übergeben.



  • *rofl* woher der Fehler kommt weis ich jetz nicht, aber das m_beschreibung soll doch sicher nicht als Text in die Datenbank oder^^ Den String solltest du dir vorher entsprechend zusammen basteln., Weil so würde der Insert den String "m_breschreibung" abschicken und nicht den Inhalt der Variable, die du sicher heir meinst



  • CString Statment;
    Statment = "INSERT INTO Artikel (Beschreibung) VALUES ("+m_beschreibungh+")";
    	db.ExecuteSQL(Statment);
    

    So?



  • wenn m_beschreibung ein CString ist, dann ja



  • ok Fehlermeldung bleibt aber immer noch 😞



  • ...weil das ein String ist und die Apostroph fehlen:

    Statment = "INSERT INTO Artikel (Beschreibung) VALUES ('"+m_beschreibungh+"')";
    

    Und willst du wirklich nur ein Feld neu in die Datenbank schreiben oder bei einem bestehenden Datensatz das Feld Beschreibung ändern/füllen ? Dann brauchst du ein UPDATE.
    Da ist übrigens ein h zu viel bei m_beschreibungh...



  • das h ist da richtig 🙂

    und ich will auch mehrere Sachen eintragen, bez. einen ganz neuen Datansatz eintragen 🙂

    Aber jetzt geht es!



  • ich denk mal das (Beschreibung) hat da nix verloren

    wenn deine Tabelle aus z.b. 3 Feldern besteht musst du (glaub ich)auch 3 Felder übergeben

    also:

    Statment = "INSERT INTO Artikel VALUES ('"+m_beschreibungh+"','','')";
    

    Jedenfalls mach ichs atm so und es tut wunderbar



  • Habt Ihr eigentlich noch nie was von SQL-Injection gehört?
    Jeder der mit SQL zu tun hat sollte sich eine Regel angewöhnen:
    Nie einen Parameter in den SQL-String einbetten!!!

    Bitte macht das über ein "?" im SQL-String und fügt den Parameter dem Abfrageobjet an.
    Fazit:

    Statment = "INSERT INTO Artikel VALUES (?,'','')";
    


  • Jochen Kalmbach schrieb:

    Habt Ihr eigentlich noch nie was von SQL-Injection gehört?
    Jeder der mit SQL zu tun hat sollte sich eine Regel angewöhnen:
    Nie einen Parameter in den SQL-String einbetten!!!

    Bitte macht das über ein "?" im SQL-String und fügt den Parameter dem Abfrageobjet an.
    Fazit:

    Statment = "INSERT INTO Artikel VALUES (?,'','')";
    

    Im Prinzip schon, nur krieg ich bei mir ums verrecken kein SQL Injection hin 🙄

    Aber hast recht auf SQL Injection sollte man generell achten



  • Jochen Kalmbach schrieb:

    Habt Ihr eigentlich noch nie was von SQL-Injection gehört?
    Jeder der mit SQL zu tun hat sollte sich eine Regel angewöhnen:
    Nie einen Parameter in den SQL-String einbetten!!!

    Bitte macht das über ein "?" im SQL-String und fügt den Parameter dem Abfrageobjet an.
    Fazit:

    Statment = "INSERT INTO Artikel VALUES (?,'','')";
    

    ??? wie mienst du das jetzt ???

    Ich mache mir meine Statements gern als Konstante udn bastel mir dann bei Bedarf das Statement zusammen. Das schick ich dann ab.



  • Jochen Kalmbach schrieb:

    Statment = "INSERT INTO Artikel VALUES (?,'','')";
    

    Genau sowas hat mir kürzlich das Projekt zerkloppt (beim Wechsel von NT zu XP war das, glaube ich), allerdings war das Fragezeichen in m_strFilter, was dann nicht mehr funktioniert hat. -> rund 400 Änderungen. Seit dem mag ich keine Fragezeichen als Platzhalter mehr 🙂



  • Pellaeon schrieb:

    Jochen Kalmbach schrieb:

    Habt Ihr eigentlich noch nie was von SQL-Injection gehört?

    ??? wie mienst du das jetzt ???

    Simples Beispiel:

    sprintf(sqlStatement, "SELECT fieldlist FROM table WHERE field = '%s'", name);
    

    Wenn das "name" nun durch jemanden externen Eingebenen werden kann (z.B. Als Eingabefeld), dann würde ein normaler Benutzer folgendes Eingeben:

    Mein Name

    Ein anderer Benutzer würde folgendes eingeben:

    x'; DROP TABLE table; --

    Fazit: Deine Tabelle ist weg.



  • Hallo? es geht doch so wie es oben steht 🙂 Wieso dann noch die große Diskusion Beschreibung ist einfach nur ein Feld in meiner Access Tabelle.



  • und was bringt da das "?" ?


Anmelden zum Antworten