Daten werden in nicht in die zweite verknüpfte Tabelle gespeichert

20/03/2008 - 17:07 von Hartmut Callies | Report spam
Hallo,
ich sitze jetzt bereits einige Zeit über das Problem, dass in die
zweite Tabelle (Auftrag) keine Daten gespeichert werden.
In der ersten Tabelle (Kunden) werden die Daten gespeichert!
Beide Tabellen sind miteinander verknüpft. Vielleicht weiß
jemand einen Rat.
Etwas vereinfacht sieht der Code so aus:

Dim strSQL As String = ""
Dim mSqlDA As SqlDataAdapter = Nothing
Dim mDS As DataSet = Nothing
Dim mDT As DataTable = Nothing
Dim mDV As DataView = Nothing
Dim objSqlCB As SqlCommandBuilder = Nothing
Dim intIndex As Integer
Dim objDataRowView As DataRowView = Nothing
Dim objDataRow As DataRow = Nothing

strSQL = "SELECT * FROM " & "Kunden" & "; "
strSQL &= "SELECT * FROM " & "Auftrag"

mSqlDA = New SqlDataAdapter(strSQL, clsSDB.GetDataBaseConnection)
'Connection funktioniert!

mSqlDA.TableMappings.Add("Table", "Kunden")
mSqlDA.TableMappings.Add("Table1", "Auftrag")

mDS = New DataSet
mSqlDA.Fill(mDS)

Dim objDataColumnParent As DataColumn =
mDS.Tables("Kunden").Columns("KundenID")
Dim objDataColumnChild As DataColumn =
mDS.Tables("Auftrag").Columns("KundenID")
Dim objDataRelation As DataRelation = New DataRelation("Kunden_Auftrag",
objDataColumnParent, objDataColumnChild)
mDS.Relations.Add(objDataRelation)

'-- Tabelle Kunden
mDT = mDS.Tables(0)
mDV = New DataView(mDT)
mDV.Sort = "KundenID"
intIndex = mDV.Find("123")
If intIndex > -1 Then
objDataRowView = mDV(intIndex)
objDataRowView.BeginEdit()
objDataRowView("Name") = "Müller"
objDataRowView.EndEdit()
Else
objDataRow = mDT.NewRow
objDataRow.BeginEdit()
objDataRow.Item("KundenID") = "123"
objDataRow.EndEdit()
mDT.Rows.Add(objDataRow)
End If

'-- Tabelle Auftrag
mDT = mDS.Tables(1)
mDV = New DataView(mDT)
mDV.Sort = "AuftragID"
intIndex = mDV.Find("987")
If intIndex > -1 Then
objDataRowView = mDV(intIndex)
objDataRowView.BeginEdit()
objDataRowView("KundenID") = "123"
objDataRowView("Status") = "offen"
objDataRowView.EndEdit()
Else
objDataRow = mDT.NewRow
objDataRow.BeginEdit()
objDataRowView("AuftragID") = "987"
objDataRow.Item("KundenID") = "123"
objDataRowView("Status") = "offen"
objDataRow.EndEdit()
mDT.Rows.Add(objDataRow)
End If

objSqlCB = New SqlCommandBuilder(mSqlDA)
mSqlDA.Update(mDS) '<<<<
Tabelle Kunden wird gespeichert und Tabelle Auftrag wird nicht gespeichert

Ein "Nachsehen" im DataSet zeigte, dass die Werte in der Tabelle Auftrag
sind.
For Each rowr As DataRow In mDS.Tables("Auftrag").Rows
Console.WriteLine(rowr("AuftragID").ToString)
Console.WriteLine(rowr("KundenID").ToString)
Console.WriteLine(rowr("Status").ToString)
Next

Wenn jemand einen Tip hat, wàre ich sehr dankbar.
Noch eine Frage zum Schluss. Warum macht es Sinn, die
Beziehungen zwischen den Tabellen bereits beim Erstellen
der Tabellen mit dem SQL-Befehl CREATE zu definieren,
wenn die Beziehungen (Relations) auch im DataSet definiert
werden müssen? Beeinflussen sich beide Definitionen?

Hartmut Callies
 

Lesen sie die antworten

#1 Peter Fleischer
20/03/2008 - 21:47 | Warnen spam
"Hartmut Callies" schrieb im Newsbeitrag
news:

strSQL = "SELECT * FROM " & "Kunden" & "; "
strSQL &= "SELECT * FROM " & "Auftrag"
...
objSqlCB = New SqlCommandBuilder(mSqlDA)
mSqlDA.Update(mDS)
'<<<< Tabelle Kunden wird gespeichert und Tabelle Auftrag wird nicht
gespeichert



Hi Hartmut,
wenn du MARS nutzt, erzeugt der CommandBuilder trotzdem nur Die
Command-Objekte für das erste SelectCommand. Das Update bezieht sich demnach
auch nur auf die erste Tabelle.

...
Noch eine Frage zum Schluss. Warum macht es Sinn, die
Beziehungen zwischen den Tabellen bereits beim Erstellen
der Tabellen mit dem SQL-Befehl CREATE zu definieren,
wenn die Beziehungen (Relations) auch im DataSet definiert
werden müssen? Beeinflussen sich beide Definitionen?



Um diese Frage zu beantworten, müsste man die konkrete Aufgabenstellung
kennen, die zu realisieren ist. Eine Beziehung in Datenbank kann nützlich
für kaskadierte Funktionalitàten sein, wie beispielsweise Löschen des
Master-Datensatzes mit Lösch-Weitergabe.

Viele Gruesse

Peter

Ähnliche fragen