SqlDataAdapter.Update不更新SQL表

时间:2014-02-19 15:38:06

标签: sql vb.net

我在获取一些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表中的更新记录,而不会引发错误,这让我感到困惑。

1 个答案:

答案 0 :(得分:0)

如果您要更新一行,我认为您需要检索该行然后更新它。假设“intField”是唯一的,你可以这样做。这是C#,但它应该给你一个想法。

//find intField row    
DataRow[] Rows = MydataTable.Select("IntField=3");

Rows[0]["TextField"] = "poiuy";
MydataTable.AcceptChanges();