我在更新通过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,我希望这将更新所有行。我不确定这是否与我的问题有关。
答案 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行,并且更新了它。)
除此之外,您始终可以在表适配器上禁用乐观并发,并且它将不再强制执行验证(尽管在这种情况下可能不会导致错误但不会更新任何行)。