【问题标题】:Concurrency violation updating a SQL database with a dataadapter使用数据适配器更新 SQL 数据库的并发冲突
【发布时间】:2010-12-18 21:58:07
【问题描述】:

我在通过数据适配器更新对数据表所做的更改时遇到了一些问题。我收到“并发冲突:UpdateCommand 影响了 10 行中的 0 行”

'Get data
Dim Docs_DistributedTable As New DataTable("Docs_Distributed")
Dim sql = "SELECT DISTINCT CompanyID, SortKey, OutputFileID, SequenceNo, DeliveredDate, IsDeliveryCodeCounted, USPS_Scanned FROM Docs_Distributed_Test"

Using sqlCmd As New SqlCommand(sql, conn)
    sqlCmd.CommandType = CommandType.Text
    Docs_DistributedTable.Load(sqlCmd.ExecuteReader)
End Using

'Make various updates to some records in DataTable. 

'Update the Database

Dim sql As String = "UPDATE Docs_Distributed "
sql += "SET DeliveredDate = @DeliveredDate "
sql += "WHERE SequenceNo = @SequenceNo"

Using transaction As SqlTransaction = conn.BeginTransaction("ProcessConfirm")

    Try
        Using da As New SqlDataAdapter
            da.UpdateCommand = conn.CreateCommand()
            da.UpdateCommand.Transaction = transaction
            da.UpdateCommand.CommandText = sql

            da.UpdateCommand.Parameters.Add("@DeliveredDate", SqlDbType.DateTime).SourceColumn = "DeliveredDate"            
            da.UpdateCommand.Parameters.Add("@SequenceNo", SqlDbType.Int).SourceColumn = "SequenceNo"
            da.ContinueUpdateOnError = False
            da.Update(Docs_DistributedTable)
        End Using
        transaction.Commit()
    Catch ex As Exception
        transaction.Rollback()
    End Try
End Using

现在问题来了。我正在选择 DISTINCT 记录,基本上每个 SequenceNo 都有一行。可能有许多行具有相同的序列号,我希望这将更新它们。我不确定这是否与我的问题有关。

【问题讨论】:

    标签: sql vb.net ado.net datatable dataadapter


    【解决方案1】:

    您的选择来自“Docs_Distributed_Test”,而您的更新是“Docs_Distributed” - 这可能是您的问题的原因。序列ID是否相同? (如果不是,那么它的更新可能确实影响了 0 行)。

    除此之外,您始终可以在表适配器上禁用乐观并发,它将不再强制执行验证(尽管在这种情况下可能不会导致错误但不会更新任何行)。

    【讨论】:

    • 天啊。就是这样。我一直对错误如此着迷,以至于我只见树木不见森林。我为自己感到羞耻。
    【解决方案2】:

    我不了解 Microsoft 特定的方面,而且 VB 通常很难理解。但这个顺序似乎很可疑:

    Using transaction As SqlTransaction = conn.BeginTransaction("ProcessConfirm")
        Try
            Using da As New SqlDataAdapter
                da.UpdateCommand = conn.CreateCommand()
                da.UpdateCommand.Transaction = transaction
    

    conn.BeginTransaction 后跟conn.CreateCommand()。这不是 a) 无用,b) 对连接状态有害,还是 c) 潜在的竞争条件?

    【讨论】:

    • 谢谢。这段代码实际上按预期工作,尽管它有点草率。现在我的代码可以工作了,可以使用更直接的方法对其进行清理。有很多方法可以用这些数据适配器做同样的事情。
    猜你喜欢
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    相关资源
    最近更新 更多