0

我在更新通过数据适配器对数据表所做的更改时遇到了一些问题。我收到“并发冲突: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 都有一行。可能有许多行具有相同的序列号,我希望这将更新它们。我不确定这是否与我的问题有关。

4

2 回答 2

0

我不了解 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) 潜在的竞争条件?

于 2009-11-20T22:33:51.403 回答
0

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

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

于 2009-11-21T07:02:01.113 回答