pcfjkg
Goto Top

VB 2010, Relation im Datset, nach Ändern oder Löschen in der Parent-Tabelle Fehler bei Zurückspeichern in SQL-SERVER

Einem Dataset (DS) werden 2 Tabellen (T_1 und T_2) mittels DS.Tables.Add("T_1") und DS.Tables.Add("T_2") hinzugefügt. Ein SqlDataAdapter DA befüllt diese

DA.SelectCommand = New SqlCommand(sqlStr, SqlConn)
DA.Fill(DS.Tables("T_1").

Jede Datatable bezieht ihre Werte aus verschiedenen Tabellen eines SQL-SERVERS, z.B. die eben gezeigte T_1 - die spätere ParentTabelle - über sqlStr = "SELECT DISTINCT TOP 100 PERCENT X, Y, Z ... [ID] FROM ErsteSQLTab).
Die Spalte [ID] ist ein PK vom Typ int und der Eigenschaft identity(0,1). Der Wert von ID ist in der SQL-Tab, welche die Source für die spätere ChildTab bildet - in der Spalte [IDBeleg] gespeichert.

Wie oben wird T_2 mit ADD und FILL dem Dataset DS hinzugefügt Über den sqlStr = "SELECT DISTINCT TOP 100 PERCENT A, B, C ... [IDBeleg] FROM ZweiteSQlTab) befüllt der SqlDataAdapter DA nunmehr T_2
DA.SelectCommand = New SqlCommand(sqlStr, SqlConn)
DA.Fill(DS.Tables("T_2").
Diese zweite SQL-Tabelle besitzt zusätzlich einen eigenen PK, ebenfalls als [ID] bezeichnet vom Typ int und der Eigenschaft identity(0,1).

Nun sei T_1 die ParentTab, T_2 deren ChildTab.

Die Relation wird hergestellt wie folgt:
Dim RelLeistungen As DataRelation = Nothing
Dim fkeyConstraint As ForeignKeyConstraint


RelLeistungen = New DataRelation("RelLeistungen", DS.Tables("T_1").Columns("ID"), DS.Tables("T_2").Columns("IDBeleg"))

fkeyConstraint = New ForeignKeyConstraint("LeistungenFKConstraint", DS.Tables("T_1").Columns("ID"),DS.Tables("T_2").Columns("IDBeleg"))
fkeyConstraint.DeleteRule = Rule.Cascade
fkeyConstraint.UpdateRule = Rule.Cascade
fkeyConstraint.AcceptRejectRule = AcceptRejectRule.Cascade

DS.Tables("T_Leistungen").Constraints.Add(fkeyConstraint)
DS.EnforceConstraints = True

DS.Relations.Add(RelLeistungen)


Das Speichern, erfolgt über

Dim SCB As SqlCommandBuilder = Nothing

SCB = New SqlCommandBuilder
SCB.DataAdapter = DA
DA.Update(DS, ("T_1"))

SCB.Dispose()

Sobald eine Zeile in der ParentTab gelöscht wird (genauer: als gelöscht markiert wird)
DS.Tables("T_1").Rows(BindingSource.Position).Delete()

oder in der ParentTab etwas geändert wird (z.B. in einem Item ein Wert)

wird als Fehler ausgegeben:

<DataColumn 'ColBez' in der DataTable 'T_1' für SourceColumn 'ColBez' ist nicht vorhanden.>

Die Spalte 'ColBez' gibt es aber nicht in T_1 (ParentTab), sehr wohl aber in T_2 (ChildTab). Es sieht so aus, als ob es nicht an der spezifischen Column 'ColBez' liegt, denn wenn ich das SELECT Kommando dergestalt ändere dass die als Fehler benannte 'ColBez' nicht mehr mit Fill die Tabelle geschrieben wird, dann wird eine beliebige andere 'ColBez' als nicht vorhanden benannt. Aber immer eine 'ColBez' aus der ChildTab T_2 wird quasi vermisst. Als ob die ParentTab auch die Spalten der ChildTab enthalten würde/müsste/sollte ? Aber ich dachte bisher, dass die Relation das organisiert und jede Tabelle für sich bearbeitet werden kann. Komisch ist auch, dass Änderungen in der ChildTab - selbst das Löschen - keine Fehler produzieren, denn:

In der ChildTab kann ich updaten und löschen ohne Probleme.

Der Fehler wird über TRY - CATCH abgefangen; es erfolgt daher auch kein Speichern (UPDATE) im SQL-SERVER.

Wo liegt der Fehler ? Vielen Dank, PCFJKG.

Content-Key: 460556

Url: https://administrator.de/contentid/460556

Printed on: April 20, 2024 at 00:04 o'clock