ApplyChangeFailed Evento
Se produce durante la carga, después de no haber podido aplicar una fila en un nodo.
Espacio de nombres: Microsoft.Synchronization.Data
Ensamblado: Microsoft.Synchronization.Data (en Microsoft.Synchronization.Data.dll)
Sintaxis
'Declaración
Public Event ApplyChangeFailed As EventHandler(Of DbApplyChangeFailedEventArgs)
'Uso
Dim instance As RelationalSyncProvider
Dim handler As EventHandler(Of DbApplyChangeFailedEventArgs)
AddHandler instance.ApplyChangeFailed, handler
public event EventHandler<DbApplyChangeFailedEventArgs> ApplyChangeFailed
public:
event EventHandler<DbApplyChangeFailedEventArgs^>^ ApplyChangeFailed {
void add (EventHandler<DbApplyChangeFailedEventArgs^>^ value);
void remove (EventHandler<DbApplyChangeFailedEventArgs^>^ value);
}
member ApplyChangeFailed : IEvent<EventHandler<DbApplyChangeFailedEventArgs>,
DbApplyChangeFailedEventArgs>
Notas
Si una fila no puede aplicarse durante la sincronización, se genera el evento ApplyChangeFailed. El objeto DbApplyChangeFailedEventArgs proporciona información sobre el error o conflicto que ha producido el error. En un controlador del evento, puede responder al evento de varias formas, incluso especificar si es necesario que el proveedor de sincronización vuelva a aplicar la fila. Para obtener más información, vea Tratar los conflictos de datos y los errores de la sincronización de base de datos (SQL Server).
Ejemplos
En los ejemplos de código siguientes se muestra cómo se pueden procesar los conflictos de actualización-actualización en un controlador del evento ApplyChangeFailed. En el ejemplo, las filas en conflicto se muestran en la consola con una opción para especificar qué fila debe prevalecer en el conflicto. Para consultar este código en el contexto de un ejemplo completo, vea Tratar los conflictos de datos y los errores de la sincronización de base de datos (SQL Server).
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.");
}
}
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.
For i As Integer = 0 To localColumnCount - 1
Console.Write(conflictingLocalChange.Rows(0)(i).ToString() & " | ")
Next
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 As Integer = 0 To remoteColumnCount - 1
Console.Write(conflictingRemoteChange.Rows(0)(i).ToString() & " | ")
Next
'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