当前位置: 代码迷 >> VB Dotnet >> 违反并发性: UpdateCommand 影响了预期 1 条记录中的 0 条。该怎么解决
  详细解决方案

违反并发性: UpdateCommand 影响了预期 1 条记录中的 0 条。该怎么解决

热度:277   发布时间:2016-04-25 02:24:02.0
违反并发性: UpdateCommand 影响了预期 1 条记录中的 0 条。
紧急求助:使用VB.NET2008 SP1+SQL SERVER2008 R2开发,在更新DATASET时使用以下方法:
 Public Overloads Function UpdateDataSet(ByVal conn As DbConnection, ByVal ds As DataSet, ByVal tbName As String) As Integer
        Dim dbCommand As DbCommand = Nothing
        Dim iResult As Integer = 0
        Try
            Dim DbDataAdapter As DbDataAdapter = dbfactory.CreateDataAdapter()
            dbCommand = conn.CreateCommand
            dbCommand.CommandText = "SELECT * FROM " & tbName
            dbCommand.CommandType = CommandType.Text
            DbDataAdapter.SelectCommand = dbCommand
            Dim cmdBuilder As DbCommandBuilder = dbfactory.CreateCommandBuilder()
            cmdBuilder.DataAdapter = DbDataAdapter
            If conn.State = ConnectionState.Closed Then
                conn.Open()
            End If
            '处理并发情况(分布式情况)
            SyncLock GetType(DBHelper)
                iResult = DbDataAdapter.Update(ds, tbName)
            End SyncLock
            Return iResult
        Catch ex As Exception
            log.Error(ex)
            Throw ex
        End Try
    End Function
程式执行到 iResult = DbDataAdapter.Update(ds, tbName)报错,提示:违反并发性: UpdateCommand 影响了预期 1 条记录中的 0 条。
在整表更新DATASET时,DATASET里面只有一个TABLE,且TABLE名和数据库中表名完全一致,数据列名和列数和数据库中也一致,这个问题要怎么处理,请各位指教,谢谢。
------解决方案--------------------
1 检查是否设有主键。
2 检查更新的字段的原始值是否为空值(原始空值更新时可能会引发此异常)。
3、多人并行操作也可能引发这样的异常。

------解决方案--------------------
DbDataAdapter用到的ds和不是从DB中读到的吧
ds和DbDataAdapter尽量保持一致

------解决方案--------------------
要注意的是从服务器资源管理器中拖进的表,表中的信息要全,例如必须要有主键,否则TableAdapter中的updatecommd等就不好用,在数据集设计器页面中,XXXTableAdapter属性中,Update Command的Text中为空。例如:XXXTableAdapter..update将不可用。
可以用编程方法使用该Table Adapter:
Public Class Form1
    Dim myAdapter As New DataSet1TableAdapters.table2TableAdapter
    Dim myDataSet As New DataSet1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        myAdapter.Fill(myDataSet.table2)
        DataGridView1.DataSource = myDataSet.table2

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Try
            Me.Validate()
            myAdapter.Update(myDataSet.table2)
            MsgBox("Update Successful!")
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub
End Class

也可从数据源中拖到Form设计页面中的控件的方法,来使用TableAdapter。
==========================================
数据库表中的字段默认为0时,用自动生成的   Me.TableAdapterManager.UpdateAll(Me.天诺油库DataSet1) ,更新
时没有填的字段,默认为0时没有为0,在程序设计时要如下图将DefaultValue 设为0 :