2009-11-20 13 views
0

데이터 어댑터를 통해 데이터 테이블에 변경 한 내용을 업데이트하는 데 문제가 있습니다. "Concurrency violation : UpdateCommand가 10 행 중 0 개에 영향을줍니다."데이터 어댑터로 SQL 데이터베이스를 업데이트하는 동시성 위반

'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 

이제 catch가 있습니다. DISTINCT 레코드를 선택하고 본질적으로 SequenceNo 당 하나의 행을 가져옵니다. 동일한 SequenceNo가있는 행이 여러 개있을 수 있으며이 행이 모두 업데이트 될 것으로 기대하고 있습니다. 이것이 내 문제와 관련이 있는지 확실하지 않습니다.

답변

0

"Docs_Distributed_Test"의 선택 사항이고 "Docs_Distributed"의 업데이트입니다. 문제의 원인 일 수 있습니다. 시퀀스 ID가 같습니까? (그렇지 않다면 실제로 업데이트로 0 행에 영향을 미친다.)

이외의 경우 테이블 어댑터에서 항상 낙관적 동시성을 비활성화 할 수 있으며 유효성 검사를 더 이상 수행하지 않습니다 (이 경우 오류는 발생하지만 행을 업데이트하지는 못하지만).

+0

OMG. 그거였다. 나는 나무에 숲을 볼 수 없다는 오류에 너무 집착했습니다. 나는 내 자신이 너무 부끄럽다. – Brett

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.BeginTransactionconn.CreateCommand()옵니다. a) 쓸모없고, b) 연결 상태에 위험하거나, c) 잠재적으로 경쟁 조건이 아닌가?

+0

감사합니다. 이 코드는 의도 한대로 작동하지만 다소 엉성함. 이제는 코드가 작동하고 더 간단한 방법으로 코드를 정리했습니다. 이러한 데이터 어댑터로 여러 가지 방법으로 동일한 작업을 수행 할 수 있습니다. – Brett

관련 문제