Ich habe folgendes Problem: Ich habe mittels Daten - neue Datenquelle hinzufügen - Datenbank - DataSet - Verweis auf eine Access-MDB (Provider=Microsoft.Jet.OLEDB.4.0;Data Source=XYZ.mdb) ein stark typisiertes Dateset erhalten, das den Inhalt der Datenbank repräsentiert. Dieser wird mit .Fill befüllt. (soweit nichts besonderes, schon unzählige male gemacht)
Nun möchte ich einen neuen Datensatz erstellen und habe mich an die Anweisungen der msdn gehalten (Gewusst wie: Einfügen neuer Datensätze in eine DatenbankGewusst wie: Einfügen neuer Datensätze in eine Datenbank)
Das funktioniert soweit auch gut und der neuen Datensatz steht im Dataset und in der Datenbank, wie gewollt. Nur hat der Datensatz im Dataset die ID = -1, was auch klar ist, weil die entsprechende Spalte im DataSet folgende Einstellungen hat:
AutoIncrement = True
AutoIncrementSpeed = -1
AutoIncrementStep = -1
Das macht soweit auch Sinn (siehe "AutoIncrement"-Spalten), wenn wenn ich den letzten DS lösche und das Programm neu starte und einen neuen DS erstelle, bekommt er die ID des gelöschten DS. (zB DS 64 wird gelöscht, nach Neustart wird erneut 64 vergeben), was aber nicht dem Verhalten von Access entspricht, denn dort hat der DS die ID = 65 und 64 bleibt leer. Soweit für mich auch klar.
Jetzt ist meine Frage, wie kann ich nach dem oben genannten Einfügen eines neuen DS das DataSet und die AccessDB soweit synchronisieren, dass die ID des neuen DS nicht -1 ist, sondern der ID des DS in der Access-DB entspricht. Momentan löse ich das indem ich den TableAdapter mit .Fill neu befülle, was aber - soweit ich es verstanden habe - nicht zweckdienlich ist, da die Datenbank komplett ausgelesen wird.
Was ich sonst noch probiert habe:
FillByID
Verwendung: Me.RegionTableAdapter.FillByID(Me.NorthwindDataSet._Region, Me.RegionTableAdapter.neueID())
Was wäre denn die beste Möglichkeit den DataTable und die Datenbank in Bezug auf ihren AutoincrementWert synchron zu halten. Danke im voraus.
Nun möchte ich einen neuen Datensatz erstellen und habe mich an die Anweisungen der msdn gehalten (Gewusst wie: Einfügen neuer Datensätze in eine DatenbankGewusst wie: Einfügen neuer Datensätze in eine Datenbank)
VB.NET-Quellcode
- ' Create a new row.
- Dim newRegionRow As NorthwindDataSet.RegionRow
- newRegionRow = Me.NorthwindDataSet._Region.NewRegionRow()
- newRegionRow.RegionID = 5
- newRegionRow.RegionDescription = "NorthWestern"
- ' Add the row to the Region table
- Me.NorthwindDataSet._Region.Rows.Add(newRegionRow)
- ' Save the new row to the database
- Me.RegionTableAdapter.Update(Me.NorthwindDataSet._Region)
Das funktioniert soweit auch gut und der neuen Datensatz steht im Dataset und in der Datenbank, wie gewollt. Nur hat der Datensatz im Dataset die ID = -1, was auch klar ist, weil die entsprechende Spalte im DataSet folgende Einstellungen hat:
AutoIncrement = True
AutoIncrementSpeed = -1
AutoIncrementStep = -1
Das macht soweit auch Sinn (siehe "AutoIncrement"-Spalten), wenn wenn ich den letzten DS lösche und das Programm neu starte und einen neuen DS erstelle, bekommt er die ID des gelöschten DS. (zB DS 64 wird gelöscht, nach Neustart wird erneut 64 vergeben), was aber nicht dem Verhalten von Access entspricht, denn dort hat der DS die ID = 65 und 64 bleibt leer. Soweit für mich auch klar.
Jetzt ist meine Frage, wie kann ich nach dem oben genannten Einfügen eines neuen DS das DataSet und die AccessDB soweit synchronisieren, dass die ID des neuen DS nicht -1 ist, sondern der ID des DS in der Access-DB entspricht. Momentan löse ich das indem ich den TableAdapter mit .Fill neu befülle, was aber - soweit ich es verstanden habe - nicht zweckdienlich ist, da die Datenbank komplett ausgelesen wird.
Was ich sonst noch probiert habe:
- Arbeite ich mit der TabeAdapter.Insert - Methode wird der DS nur in die Datenbank geschrieben, steht aber nicht in meinem DataSet. Da würd ich in aber auch benötigen. Daher bringt das auch nichts.
- Wenn ich im DataSet in der entsprechenden Tabelle unter Konfigurieren gehe und dann unter "Erweiterte Optionen" gibt es den Eintrag "Datantabelle aktualisieren" (Fügt eine Select-Anweisung nach Insert- u Update-Anweisungen hinzu, um Identitätsspralten .. abzurufen, die von der Datenbank berechnet werden) - das wäre ja eigentlich, was ich will - nur ist dieser Eintrag nicht auswählbar, da ausgegraut
- Wenn ich unter Abfrage hinfügen gehe - SQL-Anweisungen verwenden - INSERT - und eine erweiterte InsertAnweisung erstelle, die den neuen DS hinzufügt (Insert Into und dann mit Scope_Identity) den neuen abfragt (siehe unten), bekomme ich eine OleDBException (Zeichen nach Ende der SQL-Anweisung gefunden)
- Was zwar geht, aber mir auch nicht ganz korrekt erscheint - ist die höchste ID nach dem hinzufügen ermitteln und dann die Zeile mit dieser ID aktualisieren
FillByID
Verwendung: Me.RegionTableAdapter.FillByID(Me.NorthwindDataSet._Region, Me.RegionTableAdapter.neueID())
Was wäre denn die beste Möglichkeit den DataTable und die Datenbank in Bezug auf ihren AutoincrementWert synchron zu halten. Danke im voraus.