DbApplyChangeFailedEventArgs Class
Provides data for the ApplyChangeFailed event.
Assembly: Microsoft.Synchronization.Data (in Microsoft.Synchronization.Data.dll)
The DbApplyChangeFailedEventArgs type exposes the following members.
| Name | Description | |
|---|---|---|
![]() | DbApplyChangeFailedEventArgs | Initializes a new instance of the DbApplyChangeFailedEventArgs class by using table metadata, conflict, error, session, context, connection, and transaction parameters. |
| Name | Description | |
|---|---|---|
![]() | Action | Gets or sets a ApplyAction enumeration value that specifies the action to handle the conflict. |
![]() | Conflict | Gets a DbSyncConflict object that contains data and metadata for the row being applied and for the existing row in the database that caused the failure. |
![]() | Connection | Gets an IDbConnection object for the connection over which changes were tried during synchronization. |
![]() | Context | Gets a DbSyncContext object that contains data changes, anchor values, and other metadata for a synchronization session. |
![]() | Error | Gets an Exception object that contains metadata about any exceptions that occurred during synchronization. |
![]() | Session | Gets a DbSyncSession object that contains synchronization session variables, such as the ID of the peer that is synchronizing. |
![]() | Transaction | Gets or sets an IDbTransaction object that contains the transaction within which changes to tables were tried. |
If a row cannot be applied during synchronization, the ApplyChangeFailed event is raised. The DbApplyChangeFailedEventArgs object provides information about the error or conflict that caused the failure. In a handler for the event, you can respond to the event in several ways, including specifying whether the synchronization provider should try to apply the row again. For more information, see How to: Handle Data Conflicts and Errors for Database Synchronization (SQL Server).
The following code examples show how update-update conflicts can be processed in an ApplyChangeFailed event handler. In the example, the conflicting rows are displayed to the console with an option to specify which row should win the conflict. To view this code in the context of a complete example, see How to: Handle Data Conflicts and Errors for Database Synchronization (SQL Server).
localProvider.ApplyChangeFailed += new EventHandler<DbApplyChangeFailedEventArgs>(dbProvider_ApplyChangeFailed); remoteProvider.ApplyChangeFailed += new EventHandler<DbApplyChangeFailedEventArgs>(dbProvider_ApplyChangeFailed);
if (e.Conflict.Type == DbConflictType.LocalUpdateRemoteUpdate) { //Get the conflicting changes from the Conflict object //and display them. The Conflict object holds a copy //of the changes; updates to this object will not be //applied. To make changes, use the Context object. DataTable conflictingRemoteChange = e.Conflict.RemoteChange; DataTable conflictingLocalChange = e.Conflict.LocalChange; int remoteColumnCount = conflictingRemoteChange.Columns.Count; int localColumnCount = conflictingLocalChange.Columns.Count; Console.WriteLine(String.Empty); Console.WriteLine(String.Empty); Console.WriteLine("Row from database " + DbConflictDetected); Console.Write(" | "); //Display the local row. As mentioned above, this is the row //from the database at which the conflict was detected. for (int i = 0; i < localColumnCount; i++) { Console.Write(conflictingLocalChange.Rows[0][i] + " | "); } Console.WriteLine(String.Empty); Console.WriteLine(String.Empty); Console.WriteLine(String.Empty); Console.WriteLine("Row from database " + DbOther); Console.Write(" | "); //Display the remote row. for (int i = 0; i < remoteColumnCount; i++) { Console.Write(conflictingRemoteChange.Rows[0][i] + " | "); } //Ask for a conflict resolution option. Console.WriteLine(String.Empty); Console.WriteLine(String.Empty); Console.WriteLine("Enter a resolution option for this conflict:"); Console.WriteLine("A = change from " + DbConflictDetected + " wins."); Console.WriteLine("B = change from " + DbOther + " wins."); string conflictResolution = Console.ReadLine(); conflictResolution.ToUpper(); if (conflictResolution == "A") { e.Action = ApplyAction.Continue; } else if (conflictResolution == "B") { e.Action = ApplyAction.RetryWithForceWrite; } else { Console.WriteLine(String.Empty); Console.WriteLine("Not a valid resolution option."); } }
AddHandler localProvider.ApplyChangeFailed, AddressOf dbProvider_ApplyChangeFailed AddHandler remoteProvider.ApplyChangeFailed, AddressOf dbProvider_ApplyChangeFailed
If e.Conflict.Type = DbConflictType.LocalUpdateRemoteUpdate Then 'Get the conflicting changes from the Conflict object 'and display them. The Conflict object holds a copy 'of the changes; updates to this object will not be 'applied. To make changes, use the Context object. Dim conflictingRemoteChange As DataTable = e.Conflict.RemoteChange Dim conflictingLocalChange As DataTable = e.Conflict.LocalChange Dim remoteColumnCount As Integer = conflictingRemoteChange.Columns.Count Dim localColumnCount As Integer = conflictingLocalChange.Columns.Count Console.WriteLine(String.Empty) Console.WriteLine(String.Empty) Console.WriteLine("Row from database " & DbConflictDetected) Console.Write(" | ") 'Display the local row. As mentioned above, this is the row 'from the database at which the conflict was detected. Dim i As Integer For i = 0 To localColumnCount - 1 Console.Write(conflictingLocalChange.Rows(0)(i).ToString & " | ") Next i Console.WriteLine(String.Empty) Console.WriteLine(String.Empty) Console.WriteLine(String.Empty) Console.WriteLine("Row from database " & DbOther) Console.Write(" | ") 'Display the remote row. For i = 0 To remoteColumnCount - 1 Console.Write(conflictingRemoteChange.Rows(0)(i).ToString & " | ") Next i 'Ask for a conflict resolution option. Console.WriteLine(String.Empty) Console.WriteLine(String.Empty) Console.WriteLine("Enter a resolution option for this conflict:") Console.WriteLine("A = change from " & DbConflictDetected & " wins.") Console.WriteLine("B = change from " & DbOther & " wins.") Dim conflictResolution As String = Console.ReadLine() conflictResolution.ToUpper() If conflictResolution = "A" Then e.Action = ApplyAction.Continue ElseIf conflictResolution = "B" Then e.Action = ApplyAction.RetryWithForceWrite Else Console.WriteLine(String.Empty) Console.WriteLine("Not a valid resolution option.") End If
