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ごとに1つの行を取得しています。同じ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 に答える