数据集冲突

冲突检测:  
SqlDataAdapter ada;
ada.Update(IssueData.GetChanges(), "Issues') //IssueData是一个强类型的DataSet. GetChanges函数得到客户端修改过的那部分的数据集.如果没修改过,返回一个空数据集.
Private Sub daIssues_RowUpdated(sender As Object, e As SqlRowUpdatedEventArgs) Handles ada.RowUpdated
        If e.Status = UpdateStatus.ErrorsOccurred Then
             m_conflictData.Issues.Rows.Add(e.Row.ItemArray) //m_conflictData like IssueData
           //得到冲突的那条客户端数据
             e.Status = UpdateStatus.Continue
        End If
End Sub
//RowUpdated 事件。在更新每一行后,该事件将启动。使用 SqlRowUpdatedEventArgs 对象的 Status 和 Errors 属性。如果 Status 为 ErrorsOccured 并且 Errors 实例是 System.Data.DBConcurrencyException,则告诉您需要从服务器中获取冲突记录,由于下层数据被改变了,更新命令影响了0个记录.

当然这个不是自动完成的,需要UpdateCommand函数.如下:
"UPDATE Issues SET  Description = @Description WHERE IssueID = @Original_IssueID and AND Description = @Original_Description"
  UpdateCommand.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Description", System.Data.SqlDbType.NVarChar, 2000, "Description'))  //普通的更新

  UpdateCommand.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Original_IssueID", System.Data.SqlDbType.Int, 4, System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "IssueID", System.Data.DataRowVersion.Original, Nothing)) //DataRowVersion.Original

  UpdateCommand.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Original_Description", System.Data.SqlDbType.NVarChar, 2000, System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "Description", System.Data.DataRowVersion.Original, Nothing)) //DataRowVersion.Original

如果数据源已经更改过,则这个UpdateCommand影响了0个记录,发生异常.

clientRow = m_conflictData.Issues(0)  //冲突数据的客户端版本
.............//重新从服务器得到最新的IssueData
serverRow = IssueData.Issues.Rows.Find(clientRow.IssueID) //得到冲突数据的服务器版本


注:
DataRowVersion 向您通知存在 DataRow 的哪个版本。版本在以下情况下发生更改: 
在调用 DataRow 对象的 BeginEdit 方法之后,如果更改该值,则 Current 和 Proposed 值变得可用。 
在调用 DataRow 对象的 CancelEdit 方法之后,Proposed 值将被删除。 
在调用 DataRow 对象的 EndEdit 方法之后,Proposed 值变成 Current 值。 
在调用 DataRow 对象的 AcceptChanges 方法之后,Original 值变得与 Current 值相同。 
在调用 DataTable 对象的 AcceptChanges 方法之后,Original 值变得与 Current 值相同。 
在调用 DataRow 对象的 RejectChanges 之后,Proposed 值将被丢弃,版本变成 Current


DataRowState 由 DataRow 类的 RowState 属性返回的 DataRowState 枚举。
Added 该行已添加到 DataRowCollection 中,AcceptChanges 尚未调用。
Deleted 该行已通过 DataRow 的 Delete 方法被删除。
Detached 该行已被创建,但不属于任何 DataRowCollection。DataRow 在以下情况下立即处于此状态:创建之后添加到集合中之前;或从集合中移除之后。
Modified 该行已被修改,AcceptChanges 尚未调用。
Unchanged 该行自上次调用 AcceptChanges 以来尚未更改。
原文地址:https://www.cnblogs.com/Joseph/p/310938.html