INSERT INTO Fehler bei DB Programmierung mit BindingNavigator



  • Hallo Zusammen,

    Probier gerade eine simple Datenbankanwendung zu erstellen, das Programm besteht aus nur drei Textboxen und soll die dort eingebenen Infos in eine Datenbank abspeichern, hab das mit dem Bindingsnavigator und ADO.NET gemacht (OLEDB).
    Die Datenbank ist eine Access Datenbank, eigentlich verbindet sich das Programm auch mit der Datenbank, ich hab auch noch ein Button hinzugefügt um wieder etwas in der Datenbank abzuspeichern, jedoch kommt immer diese Fehlermeldung wenn ich etwas speichern will.

    An unhandled exception of type 'System.Data.OleDb.OleDbException' occurred in System.Data.dll

    Additional information: Syntax error in INSERT INTO statement.

    Der Code im Button lautet folgend:

    // 6. Änderungen in DataSet in Datenbank schreiben
    				 bindingSource1->EndEdit();
    				 dbAdapter->Update(dataSet1->Tables["Test"]);
    

    Wäre echt froh wenn mir jemand weiterhelfen könnte, habe nirgends in WWW was hilfreiches gefunden 😞



  • Gibts eine InnerException?



  • Hallo Theta,

    Was meinst du mit Innerexception ganz genau? Ich hab noch try and catch eingebaut, bei catch ist dann jeweil Fehlermeldungen drin z.B Filename falsch oder Datenbank nicht gefunden etc..

    catch (OleDbException ^ex)
    {
    MessageBox::Show(ex->Message, "Datenbankfehler");
    }
    

    Danke noch für die schnelle Antwort



  • InnerException ist ein Property von Exception.



  • Nein habe eigentlich keine Innerexceptions definiert, hmmm an was kann es sonst noch liegen? Die Spalten etc in der Access Datenbank sind alle auch richtig konfiguriert...



  • Nicht DU definierst die, sondern Du kannst sie abfragen!
    Einfach ex->InnerException halt...



  • Nein, die innere Exception mußt du nicht definieren, die wird mit etwas Glück vom System bereitgestellt. Du solltest nur nachsehen, ob sie exisitert - und sie dann auswerten:

    catch (OleDbException ^ex)
    {
      MessageBox::Show(ex->Message, "Datenbankfehler");
      if(ex->InnerException)
        MessageBox::Show(ex->InnerException->Message, "Datenbankfehler inner");
    }
    

    Außerdem solltest du mal versuchen herauszufinden, wie dieses fehlerhafte INSERT-Statement eigentlich aussieht.



  • Danke für die Erklärung von InnerExceptions, schon wieder was gelernt 🙂
    Ich hab es wie CStoll hinzugefügt, aber anscheinend existieren keine, es erscheint keine Fehlermeldung.
    Desweitern habe ich noch den INSERT Befehl angeschaut beim Debuggen, dort steht auch nichts.. als Wert erscheint undefined value, Eigentlich werden ja die SQL Befehle vom BindingsNavigator und dem OLEDB Adapter zu Verfügung gestellt, sollte dann eigentlich der Code nicht richtig sein?



  • Hab die Sache nochmals angeschaut und folgende Fragen sind mir aufgetaucht, es gibt ja noch eine andere Methode mit der Datenbank zu kommunizieren und zwar das ohne DataSet direkt befehl->CommandText = "SQL COMMAND"; weitergibt benützt. Nun mit diesen Befehl kann ich in die Datenbank hineinschreiben, aber habe das Problem das ich Variabeln im SQL Befehl habe.
    Das Problem ist bei einer Variable welches ein String Text ist, will ja SQL so ein Hochkomma, wenn ich wüsste wie man dann in einer Variable Hochkomma eingibt würde es klappen...
    Ich hätte drei Variabeln, zwei mal String Variabeln und ein mal eine Array Variable, wie müsste ich das mit der Array Variable realisieren? Kann man mit einem SQL Befehl direkt mehrere Werte vom Array in eine Spalte speichern?

    befehl->CommandText = "INSERT INTO test (Name, Nachname, Geräte) VALUES ('Surname', 'Name', 'Device')";
    

    Das wäre ein simpler SQL Befehl, wie müsste ich es nun mit der Variabeln machen, damit es mit den Hochkommas und Array auch klappt?

    befehl->CommandText = "INSERT INTO test (Name, Nachname, Geräte) VALUES ("+Surname+", "+Name+", "+Device+")";
    

    Wenn ich die Hochkommas direk im SQL Befehl eingebe stimmt dann die "Formatierung" nicht mehr

    befehl->CommandText = "INSERT INTO test (Name, Nachname, Geräte) VALUES ("+'Surname'+", "+'Name'+", "+'Device'+")";
    

    Hab echt keine Ahnung mehr wie ich weiterkommen könnte... Wäre für jeden Tipp und Hilfe dankbar.

    Gruss



  • Hallo,

    du mußt die einfachen Anführungsstriche in den SQL-String schreiben:

    befehl->CommandText = "INSERT INTO test (Name, Nachname, Geräte) VALUES ('"+Surname+"', '"+Name+"', '"+Device+"')";
    

    Da dies aber sehr anfällig ist (Stichwort: SQL-Injection), solltest du unbedingt SQL-Parameter benutzen.
    Hier ein guter Artikel dazu (Beispiele aber in C#!): Parameter von SQL-Befehlen

    BTW. C# wäre sowieso die bessere Wahl für das Schreiben einer GUI-Anwendung mit DB-Anbindung (s.a. http://www.c-plusplus.net/forum/263084)



  • Hallo,

    Danke für die Antwort, jetzt kann ich auch Variabeln hinzufügen. Weisst du vielleicht wie man auch eine ArrayVariable in ein SQL Befehl einfügen kann?
    Also dass mehrere Werte von einer Variable direkt mit dem SQL Befehl in eine Spalte geschrieben werden?


Anmelden zum Antworten