SqlDataAdapter => Update-Problem

06/03/2009 - 01:12 von Maik Weiß | Report spam
Hallo NG,

ich lade über eine Stored Procedure zwei
Tabellen in ein DataSet und binde die 2 Tabellen
an zwei DataGridViews (DGVs).

Stored Procedure (SP) sieht so aus:

ALTER PROCEDURE [admin_SA].[testSP]
@artikelID AS VARCHAR(20)

AS
BEGIN
SELECT * FROM tblArtikel WHERE ID_artikel = @artikelID

SELECT * FROM tblArtikel_LiederantenZuordnung WHERE ID_artikel @artikelID
END


.NET-Load-Funktion:

Using conn As New SqlConnection(connString)
Dim sqlComm As SqlCommand = New SqlCommand("testSP", conn)
sqlComm.CommandType = CommandType.StoredProcedure
sqlComm.Parameters.AddWithValue("@artikelID", "BE-223")
Dim reader As SqlDataAdapter = New SqlDataAdapter(sqlComm)
reader.TableMappings.Add("Table", "Artikel")
reader.TableMappings.Add("Table1", "LieferantenZuordnung")
reader.Fill(myDS)
End Using

Dim rel As New DataRelation("test",
myDS.Tables("Artikel").Columns("ID_artikel"), _
myDS.Tables("LieferantenZuordnung").Columns("ID_artikel"))

myDS.Relations.Add(rel)

Dim bs1 As New BindingSource(myDS, "Artikel")
Dim bs2 As New BindingSource(bs1, "test")

DataGridView1.DataSource = bs1
DataGridView2.DataSource = bs2
-



Nun versuche ich die Änderungen über folgenden Aufruf in die DB zurück zu
schreiben:

Using conn As New SqlConnection(connString)
Dim sqlComm As SqlCommand = New SqlCommand("testSP", conn)
sqlComm.CommandType = CommandType.StoredProcedure
sqlComm.Parameters.AddWithValue("@artikelID", "BE-223")
Dim reader As SqlDataAdapter = New SqlDataAdapter(sqlComm)
reader.TableMappings.Add("Table", "Artikel")
reader.TableMappings.Add("Table1", "LieferantenZuordnung")

Dim cb As SqlCommandBuilder = New SqlCommandBuilder(reader)

DataGridView1.EndEdit()
DataGridView2.EndEdit()

Dim x As Integer = reader.Update(myDS)

Console.WriteLine("Saved DS: " & x)
End Using

Es werden nur die Datensàtze gespeichert die im DataGridView1 geàndert
wurden. (inkl. der Relation zur 'LieferantenZuordnung'-Tabelle, d.h. jedoch
nur die Änderungen an der Relations-PK/FK-Verknüpfung "id_artikel")
Alle anderen selbst durchgeführten Änderungen in dem zweiten DGV werden
nicht gespeichert.

Woran liegt das?

Fnktioniert das nicht über eine Stored Procedure die ein Recordset mit 2
Tabellen zurück liefert oder was ist falsch?

Gruß
Maik
 

Lesen sie die antworten

#1 Peter Fleischer
06/03/2009 - 09:34 | Warnen spam
"Maik Weiß" schrieb im Newsbeitrag
news:1j6vdwe02ndok$.18dhhcznfv9pt$

ich lade über eine Stored Procedure zwei
Tabellen in ein DataSet und binde die 2 Tabellen
an zwei DataGridViews (DGVs).
...
BEGIN
SELECT * FROM tblArtikel WHERE ID_artikel = @artikelID

SELECT * FROM tblArtikel_LiederantenZuordnung WHERE ID_artikel > @artikelID
END
...
Nun versuche ich die Änderungen über folgenden Aufruf in die DB zurück zu
schreiben:

Using conn As New SqlConnection(connString)
Dim sqlComm As SqlCommand = New SqlCommand("testSP", conn)
sqlComm.CommandType = CommandType.StoredProcedure
sqlComm.Parameters.AddWithValue("@artikelID", "BE-223")
Dim reader As SqlDataAdapter = New SqlDataAdapter(sqlComm)
reader.TableMappings.Add("Table", "Artikel")
reader.TableMappings.Add("Table1", "LieferantenZuordnung")

Dim cb As SqlCommandBuilder = New SqlCommandBuilder(reader)

DataGridView1.EndEdit()
DataGridView2.EndEdit()

Dim x As Integer = reader.Update(myDS)

Console.WriteLine("Saved DS: " & x)
End Using

Es werden nur die Datensàtze gespeichert die im DataGridView1 geàndert
wurden. (inkl. der Relation zur 'LieferantenZuordnung'-Tabelle, d.h.
jedoch
nur die Änderungen an der Relations-PK/FK-Verknüpfung "id_artikel")
Alle anderen selbst durchgeführten Änderungen in dem zweiten DGV werden
nicht gespeichert.

Woran liegt das?

Fnktioniert das nicht über eine Stored Procedure die ein Recordset mit 2
Tabellen zurück liefert oder was ist falsch?



Hi Maik,
der CommandBuilder nimmt das erste Select und erstellt daraus die
Command-Objekte für das Update. Der DataAdapter ist nicht in der Lage, zu
jedem Vorgang eine Liste von Command-Objekten zu halten, um auf mehrere
Tabellen zuzugrifen.

Du musst deshalb einen zweiten DataAdapter bemühen, um auch die zweite
Tabelle zu aktualisieren. Diesem zweiten DataAdapter musst du dann die
CommandObjekte für das Update selbst bereitstellen oder auch mit einem
passenden SelectCommand-Objekt die Vorlage für einen CommandBuilder liefern.

Viele Grüsse
Peter

Ähnliche fragen