我在获取一些VB.NET代码来更新我的MS SQL表时遇到了一些麻烦。
在实际程序中,DataTable作为xml序列化的DataTable从文件中读取,但我已将问题代码减少到以下内容:
Imports System.Data.SqlClient
Module Module1
Sub Main()
Dim myConn As New SqlConnection("<myconnstring>")
Dim myDA As New SqlDataAdapter("SELECT * FROM TestTable WHERE 1=2", myConn)
Dim myTable As New DataTable
myDA.Fill(myTable)
Dim myRow As DataRow
myRow = myTable.NewRow
myRow("IntField") = 4
myRow("TextField") = "loik"
myTable.Rows.Add(myRow)
myRow.AcceptChanges()
myRow.SetAdded()
myRow = myTable.NewRow
myRow("IntField") = 3
myRow("TextField") = "poiuy"
myTable.Rows.Add(myRow)
myRow.AcceptChanges()
myRow.SetModified()
Dim myCB As New SqlCommandBuilder(myDA)
' My changes should overwrite whatever is already in the database
myCB.ConflictOption = ConflictOption.OverwriteChanges
Debug.Print(myCB.GetInsertCommand.CommandText)
Debug.Print(myCB.GetUpdateCommand.CommandText)
Debug.Print(myDA.Update(myTable))
End Sub
End Module
最初,TestTable看起来像这样(IntField是表上的主键):
IntField TextField
---------------------
1 qwert
2 asdfg
3 zxcvb
运行程序后,TestTable看起来像这样:
IntField TextField
---------------------
1 qwert
2 asdfg
3 zxcvb
4 loik
正确添加新记录(IntField = 4),但更新的记录(IntField = 3)不包含TextField中的新值。
程序的输出(3个调试行)是:
INSERT INTO [TestTable] ([IntField], [TextField]) VALUES (@p1, @p2)
UPDATE [TestTable] SET [IntField] = @p1, [TextField] = @p2 WHERE (([IntField] = @p3))
2
我还在SQL Server上创建了一个跟踪(使用Profiler),这是唯一执行的语句:
SELECT * FROM TestTable WHERE 1=2
SET FMTONLY OFF; SET NO_BROWSETABLE ON; SET FMTONLY ON;SELECT * FROM TestTable WHERE 1=2 SET FMTONLY OFF; SET NO_BROWSETABLE OFF;
exec sp_executesql N'INSERT INTO [TestTable] ([IntField], [TextField]) VALUES (@p1, @p2)',N'@p1 int,@p2 nvarchar(4)',@p1=4,@p2=N'loik'
因此,由于某种原因,代码似乎决定不更新SQL表中的更新记录,而不会引发错误,这让我感到困惑。
答案 0 :(得分:0)
如果您要更新一行,我认为您需要检索该行然后更新它。假设“intField”是唯一的,你可以这样做。这是C#,但它应该给你一个想法。
//find intField row
DataRow[] Rows = MydataTable.Select("IntField=3");
Rows[0]["TextField"] = "poiuy";
MydataTable.AcceptChanges();