Problem mit AutoIncrement-Werten im Dataset

31/08/2009 - 15:49 von Martin Steiger | Report spam
Hallo NG

Ich hab ein seltsames Problem im Zusammenhang mit Autoincrement-Spalten
in zwei Tabellen (MySQL und VSS2008, FW 3.5 SP1).

Verteiler:
**********
verteiler_id (PK Autoincrement)
verteiler_beschreibung

Ports:
**********
port_id (PK Auto-Increment)
verteiler_id (FK aus Verteiler-Tabelle)
port_beschreibung

Bei beiden Tabellen verwende ich einen Dataadapter um die Tabelle zu
füllen und dann wird die DataTable zu einem Dataset hinzugefügt. Die
beiden PK-Spalten haben AutoIncrement = True, AutoIncrementSeed = -1 und
AutoIncrementStep = -1.

Im Dataset habe ich eine Datarelation mit den beiden jeweiligen Kolonnen
hinzugefügt (CreateConstraints = True).

Damit ich in der Datatable nach dem DataAdapter.Update jeweils die
richtigen Primary-Keys habe, wurde dem DataAdapter ein
RowUpdated-Handler zugewiesen, der bei Insert-Statements jeweils den
richtigen Autoincrement aus der Datenbank holt und diesen in der Tabelle
eintràgt (Mit AcceptChanges).

Private Sub VerteilerChanged(ByVal sender As Object, _
ByVal e As MySqlRowUpdatedEventArgs)
Select Case e.StatementType
Case StatementType.Insert
Dim ID As Integer = CInt(New MySqlCommand( _
"SELECT LAST_INSERT_ID() FROM verteiler",_
Connection).ExecuteScalar)
e.Row.Item("verteiler_id") = ID
e.Row.AcceptChanges()
End Select
End Sub

Dasselbe existiert auch für die Port-Tabelle...

Wenn ich nun einen neuen Verteiler und dazu einen neuen Port eintrage,
dann wird durch die Datarelation in der Tabelle Ports der richtige FK
(vor dem Update z.B. -1) eingetragen.

Nun wird zuerst für den Verteiler-DataAdapter ein Update durchgeführt
und danach dasselbe für den Port-Dataadapter.

Wenn ich nach dem Update des Verteiler-Dataadapter im Dataset die
Tabelle Ports anschaue, dann steht dort in der Spalte verteiler_id (FK)
die korrekte, aktualisierte ID aus der Datenbank drin (also z.B. 1).

Wenn ich dann aber den Port-Adapter update, dann schreibt er wieder den
vorherigen Wert (-1), also den Wert wie vor dem Verteiler-Update rein.

Wenn ich das RowUpdated-Event des Port-Adapters debugge, dann steht in
e.Row.Item("verteiler_id") die korrekte Verteiler-ID (also z.B. 1) drin.
In der Datenbank selber (und auch in e.Row.Item("verteiler_id",
DataRowVersion.CurrentVersion) ist aber nach wie vor die falsche ID (-1)
drin.

Kann mir irgendjemand sagen, wo ich hier den Denkfehler habe, bzw. wieso
der aktualisierte FK nicht in die Datenbank zurückgeschrieben wird?

Für die Hilfe danke ich im Voraus...

Gruss,
Martin
 

Lesen sie die antworten

#1 Peter Fleischer
31/08/2009 - 16:04 | Warnen spam
"Martin Steiger" schrieb im Newsbeitrag
news:h7gkd1$6k1$
...
Kann mir irgendjemand sagen, wo ich hier den Denkfehler habe, bzw. wieso
der aktualisierte FK nicht in die Datenbank zurückgeschrieben wird?



Hi Martin,
vermutlich aktualisierst du in der falschen Reihenfolge. Notwendig ist:

' New Row's
- Master
- Child

' Updated Row's
- Master
- Child

' Deleted Row's
- Child (nur, wenn kein kaskadiertes Delete in der DB; ob das MySql kann,
weiß ich nicht)
- Master

Viele Grüsse
Peter

Ähnliche fragen