并发冲突使用dataadapter更新SQL数据库

时间:2009-11-20 22:06:19

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

我在更新通过dataadapter对数据表所做的更改时遇到了一些麻烦。我得到“并发冲突: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基本上得到一行。可能有许多行具有相同的SequenceNo,我希望这将更新所有行。我不确定这是否与我的问题有关。

2 个答案:

答案 0 :(得分:0)

我不明白微软特有的方面,加上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)潜在的竞争条件?

答案 1 :(得分:0)

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

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