VB.NET ADO: AutoIncrease verhält sich merkwürdig im DataTable
-
Mahlzeit,
ich habe eine Tabelle "UnitTypes" in meinem Dataset und wollte den PK automatisch hochzählen lassen. Dafür hab ich nach dem Fill folgendes im Code stehen:
m_dataSet.Tables("UnitTypes").Columns("TypeID").AutoIncrement = True Dim rows As DataRow() = m_dataSet.Tables("UnitTypes").Select("MAX(TypeID)") If rows.GetLength(0) > 0 Then m_dataSet.Tables("UnitTypes").Columns("TypeID").AutoIncrementSeed = CInt(rows(0).Item("TypeID")) + 1 Else m_dataSet.Tables("UnitTypes").Columns("TypeID").AutoIncrementSeed = 1 End If m_dataSet.Tables("UnitTypes").Constraints.Add(New UniqueConstraint(m_dataSet.Tables("UnitTypes").Columns("TypeName")))
TypeName soll nicht mehrfach in der Tabelle auftreten, ich hätte auch einen zusammengesetzten PK machen können aber so erschien es mir ebenfalls sinnvoll.
Nun hab ich eine Funktion die ein Excel Sheet parsed und mir die Tabelle aus den Daten füllen soll. Dabei tritt allerdings der TypeName mehrfach auf.
Private Function InsertRowUnitType(ByVal typeName As String) As Boolean Dim table As DataTable = m_dataSet.Tables("UnitTypes") If table Is Nothing Then Return False End If Dim record As DataRow = table.NewRow record("TypeName") = typeName record("LanguageCodes") = "en" Try table.Rows.Add(record) Catch ex As ConstraintException Return False End Try Return True End Function
Jedesmal wenn ich einen typeName einfügen will der schon existiert, krieg ich False zurück, soweit so gut. Aber trotz des mißglückten Add-Versuchs wird der PK hochgezählt Das hat den Effekt, dass ich am Ende 20 Einträge in der Tabelle hab, aber die TypeID Werte zwischen 1 und 3400 aufweist.
Kann ich es verhindern dass durch AutoIncrease hochgezählt wird wenn so ein Insert fehlschlägt?Gruss
Niels
-
IUnknown schrieb:
TypeName soll nicht mehrfach in der Tabelle auftreten, ich hätte auch einen zusammengesetzten PK machen können aber so erschien es mir ebenfalls sinnvoll.
Ja, ist richtig so. Ein Superschlüssel wäre nicht sinnvoll, der Unique-Constraint ist ausreichend.
IUnknown schrieb:
...aber trotz des mißglückten Add-Versuchs wird der PK hochgezählt Das hat den Effekt, dass ich am Ende 20 Einträge in der Tabelle hab, aber die TypeID Werte zwischen 1 und 3400 aufweist.
Warum stört Dich das? Es muß doch nur eindeutig sein. Was willst Du mit den Daten in der DataTable anstellen? Es hängt sehr stark davon ab, wie Dein spezifischer ADO.NET-Treiber implementiert ist. Normalerweise sind diese Werte bei Autoinkrement-Spalten eingefügter Zeilen nur Platzhalter, die bei einer Aktualisierung der DB erst angepasst werden. Denn inzwischen könnte ja von jemand anderem Zeilen in die DB-Tabelle eingefügt worden sein, so dass noch der Offset ermittelt werden muss, um dessen Wert die Primärschlüsselwerte Deiner neuen Zeilen versetzt werden müssen.
-
Ah ok, die Sache mit den Platzhaltern ist mir noch garnicht in den Sinn gekommen, klingt aber logisch. Wie sieht das aus, wenn ich den AutoIncrement Primärschlüssel in anderen Tabellen als Fremdschlüssel benutze. Werden die dann beim Update() auch angepaßt? Sonst stimmt das ja vorn und hinten nicht mehr.
-
Das hängt davon ab, ob Du die Tabellen mit DataRelation-Objekte verknüpft hast.