Verwenden Sie Mehrere DataTables in ein DataSet zum Einfügen neuer Datensätze in Access DB

VB2010 habe ich ein DataSet und ich füge mehrere Tabellen, die ich dann füllen Sie diese Tabellen, und legen Sie dann die Datensätze in eine Access-db.

    'create a new DataSet
    Dim dsNav As New DataSet

    'first table
    Dim daTrips As New OleDb.OleDbDataAdapter("SELECT * FROM Trips", connNav)
    daTrips.Fill(dsNav, "Trips")
    Dim cbTrips As New OleDb.OleDbCommandBuilder(daTrips)

   'second table
    Dim daCars = New OleDb.OleDbDataAdapter("SELECT * FROM Cars", connNavDb)
    daCars.Fill(dsNav, "Cars")
    Dim cbCars As New OleDb.OleDbCommandBuilder(daCars)

    'here i open a huge text file and depending on the data i encounter, I create
    'a new DataRow and add it to the appropriate table. i add many new rows to each
    'table. for example
    Dim dsNewRow As DataRow = {tblCars}.NewRow()
    dsNewRow.Item("CarId") = textline.Substring(0, 10)
    dsNewRow.Item("CarMake") = textline.Substring(11, 15)
    tblCars.Rows.Add(dsNewRow)

    'i finish reading the text file and filling up the tables in the one DataSet
    'now i want to insert those records into the Access db
    Dim rowCnt1 As Integer = daTrips.Update(dsNav, "Trips")
    Dim rowCnt2 As Integer = daCars.Update(dsNav, "Cars")

Dem ersten update funktioniert, aber auf das zweite update, bekomme ich die exception:

Erste chance Ausnahme des Typs " System.Daten.OleDb.OleDbException' occurred in System.Data.dll
System.Daten.OleDb.OleDbException (0x80040E14): Syntax Fehler in der INSERT INTO-Anweisung.
System.Daten.Common.DbDataAdapter.UpdatedRowStatusErrors(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)
System.Daten.Common.DbDataAdapter.UpdatedRowStatus(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)
System.Daten.Common.DbDataAdapter.Update(DataRow[] von DataRows, DataTableMapping tableMapping)
System.Daten.Common.DbDataAdapter.UpdateFromDataTable(DataTable dataTable, DataTableMapping tableMapping)
System.Daten.Common.DbDataAdapter.Update(DataSet dataSet, String srcTable)

Ich habe verschiedene Artikel und Sie alle empfehlen die Aktualisierung einer Datenbank mit einem DataSet mit mehreren DataTables ist machbar, aber nur kann nicht herausfinden, warum dies so ist, Bombardierung.

  • Schwer zu sagen, was passiert. Ich werde versuchen, um zu sehen, was ist der Befehl text einfügen auf den Befehl daCars adapter. daCars.InsertCommand.CommandText
  • Also habe ich ein debug debug.Print(daTrips.InsertCommand.CommandText) direkt vor der daTrips.Update und es throwws eine Ausnahme System.NullReferenceException. Gleiche Sache mit UpdateCommand. Ich nicht setzen diese auf allen. Ich dachte, die OleDbCommandBuilder setzen diese für Sie.
  • Die Autos, die Tabelle enthält lediglich die beiden Felder oben, oder es gibt andere Felder? Könnte man den Namen dieser anderen Felder, wenn vorhanden?
  • Versuchen Sie auch, mit dieser - daCars.InsertCommand = cbCars.GetInsertCommand(); die schauen dann InsertCommand.CommandText
  • Nochmals, die PKW-Tabelle hat einen primary key definiert? Wenn Sie möchten, dass commandbuilder die Arbeit mit updates, die Tabelle muss einen Primärschlüssel haben.
  • Nein, es gibt Tonnen mehr Felder und mehrere weitere Tabellen. ich zeigte nur diese beiden für Einfachheit. Dont belive Felder sind reservierte Wörter. Die Autos, die Tabelle in der Datenbank hat eine multi-Feld-index und diese gleiche Felder als Primärschlüssel. Das ist in der Datenbank-Tabelle. In den code meiner DataTable scheint keine primary keys. Muss ich für diejenigen, die manuell entsprechend der db-Tabelle?
  • Nein, Sie könnten versuchen, mit daCars.MissingSchemaAction = MissingSchemaAction.AddWithKey kurz bevor die Fill-Methode aufrufen Refs hier
  • ok, ich fügte hinzu, daCars.MissingSchemaAction = MissingSchemaAction.AddWithKey zu meinem DataAdapter. Scheint, dass die keys sind nun Teil der Datentabelle sein, aber noch immer die Ausnahme. Einfach nicht scheinen, um herauszufinden, whats going on.
  • Letzte, was, warum benutzt du zwei verschiedene Anschlüsse? (daTrips auf connNav, daCars auf connNavDb)
  • Im gehend, es zu reparieren, da kann ich nur einen DataAdapter. Ich geändert es weil ich dachte, dass vielleicht die Quelle des Problems.
  • OK, ich denke ich habe gefunden das große Problem. Zuerst möchte ich mich dafür entschuldigen, dass Sie so ignorant, dass ich dachte, es könnte nicht vielleicht sein, meine Felder. Ich wieder Lesen Sie den gesamten thread und deinen zweiten post führte mich zu überprüfen. Sicher genug, drei Tische waren Felder mit Leerzeichen, Schrägstriche und ein reserviertes Wort ist "Zeit". Änderte ich diesen in der db und in meinem code, und es funktioniert. wow!!! agin Entschuldigung. Ich sollte haben folgte Ihren Vorsprung zunächst.
  • So jetzt zu dem DataAdapter. Wie soll ich eine Instanz des DataAdapter? Ich scheine Schwierigkeiten zu haben die Verwaltung der ein dataadapter und dann die Erstellung der OleDbCommandBuilder für jede Tabelle, so dass ich es aktualisieren.
  • Sorry für die Verspätung, aber es war Nacht hier. Gut, zwei DataAdapters Recht. Und jeder sollte seine commandbuilder. Sie können nicht ändern die Quell-schema in der DataAdapter-denn dann wird der CommandBuilder wird synchron mit adapter. Gehen wir also mit zwei Adaptern mit jeweils CommandBuilder, aber, wenn die Datenbank die gleiche ist, dann Sie wirklich brauchen nur eine Verbindung.
  • Gotcha. Es funktioniert gut so wie es ist. Wie markiere ich diesen thread als Antwort?

InformationsquelleAutor sinDizzy | 2012-06-29
Schreibe einen Kommentar