2009-11-20 2 views
0

У меня возникли проблемы с обновлением изменений, которые я внес в datatable через dataadapter. Я получаю «нарушение параллелизма: UpdateCommand затронуло 0 из 10 строк» ​​Нарушение параллелизма, обновляющее базу данных SQL с помощью dataadapter

'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

Ваш выбор от «Docs_Distributed_Test», и ваше обновление относится к «Docs_Distributed» - это может быть причиной вашей проблемы. Являются ли идентификаторы последовательности одинаковыми? (Если нет, возможно, это действительно влияет на 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.BeginTransaction следует conn.CreateCommand(). Разве это не бесполезно, б) опасно для состояния соединения или в) потенциально состояние гонки?

+0

Спасибо. Этот код действительно работает по назначению, хотя он немного неряшлив. Теперь, когда у меня работает код, очистите его, используя более простые методы. Есть так много способов сделать то же самое с этими dataadapters. – Brett