Erstens, wenn du Daten mit .Fill() liest und wieder (als new) schreiben willst brauchst
du dataadapter.AcceptChangesDuringFill = False,
sonst hast du keine "Änderungen" in der DataTable, die du mit .Update() schreiben
kannst.
Zweitens generiert CommandBuilder keinen Parameter und keine Spalte für Update/Insert für eine AutoIdentity
Spalte, das wird nicht klappen. Mit solchem Code klappt's aber:
' Ist nur ein Test, "Row hinzufügen"
Dim ndr As DataRow = _dt.NewRow
For Each col As DataColumn In _dt.Columns
ndr(col.ColumnName) = _dt.Rows(0)(col.ColumnName)
Next
ndr("OrderID") = 11080 ' Ist max plus 3 oder so...
_dt.Rows.Add(ndr)
Try
Dim dt As DataTable = _dt.GetChanges()
_sqlConn.Open()
Dim cmd As New SqlCommand("SET IDENTITY_INSERT Orders ON", _sqlConn)
Dim isql = "INSERT INTO Orders( OrderID, CustomerID , EmployeeID ," & _
"OrderDate , RequiredDate , ShippedDate , ShipVia , Freight ," & _
"ShipName , ShipAddress , ShipCity , ShipRegion , ShipPostalCode" & _
", ShipCountry ) VALUES ( @p0, @p1 , @p2 , @p3 , @p4 , @p5 , @p6" & _
", @p7 , @p8 , @p9 , @p10 , @p11 , @p12 , @p13 )"
Dim icmd As New SqlCommand(isql, _sqlConn)
icmd.Parameters.Add("@p0", SqlDbType.Int, 4, "OrderID")
icmd.Parameters.Add("@p1", SqlDbType.NChar, 0, "CustomerID")
icmd.Parameters.Add("@p2", SqlDbType.Int, 0, "EmployeeID")
icmd.Parameters.Add("@p3", SqlDbType.DateTime, 0, "OrderDate")
icmd.Parameters.Add("@p4", SqlDbType.DateTime, 0, "RequiredDate")
icmd.Parameters.Add("@p5", SqlDbType.DateTime, 0, "ShippedDate")
icmd.Parameters.Add("@p6", SqlDbType.Int, 0, "ShipVia")
icmd.Parameters.Add("@p7", SqlDbType.Money, 0, "Freight")
icmd.Parameters.Add("@p8", SqlDbType.NVarChar, 0, "ShipName")
icmd.Parameters.Add("@p9", SqlDbType.NVarChar, 0, "ShipAddress")
icmd.Parameters.Add("@p10", SqlDbType.NVarChar, 0, "ShipCity")
icmd.Parameters.Add("@p11", SqlDbType.NVarChar, 0, "ShipRegion")
icmd.Parameters.Add("@p12", SqlDbType.NVarChar, 0, "ShipPostalCode")
icmd.Parameters.Add("@p13", SqlDbType.NVarChar, 0, "ShipCountry")
_sqlDa.InsertCommand = icmd ' Nur INSERT notwendig hier
Dim res As Integer = cmd.ExecuteNonQuery()
res = _sqlDa.Update(dt)
cmd = New SqlCommand("SET IDENTITY_INSERT Orders OFF", _sqlConn)
res = cmd.ExecuteNonQuery()
Catch ex As Exception
Debug.WriteLine(ex.ToString())
Finally
_sqlConn.Close()
End TrySET IDENTITY_INSERT OFF ist eigentlich überflüssig, weil das nur gültig bleibt bis connection.Close().
________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist |