Condividi tramite


Evento RelationalSyncProvider.ApplyChangeFailed

Si verifica durante il caricamento, se non è stato possibile applicare una riga a un nodo.

Questo evento non è conforme a CLS.  

Spazio dei nomi: Microsoft.Synchronization.Data
Assembly: Microsoft.Synchronization.Data (in microsoft.synchronization.data.dll)

Sintassi

'Dichiarazione
Public Event ApplyChangeFailed As EventHandler(Of DbApplyChangeFailedEventArgs)
'Utilizzo
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);
}
/** @event */
public void add_ApplyChangeFailed (EventHandler<DbApplyChangeFailedEventArgs> value)

/** @event */
public void remove_ApplyChangeFailed (EventHandler<DbApplyChangeFailedEventArgs> value)
JScript supports the use of events, but not the declaration of new ones.

Osservazioni

Se non è possibile applicare una riga durante la sincronizzazione, viene generato l'evento ApplyChangeFailed. L'oggetto DbApplyChangeFailedEventArgs fornisce informazioni sull'errore o sul conflitto che ha generato il problema. In un gestore eventi è possibile rispondere all'evento in diversi modi, ad esempio specificando se il provider di sincronizzazione deve tentare o meno di applicare di nuovo la riga. Per ulteriori informazioni, vedere Procedura: gestire conflitti di dati ed errori per la sincronizzazione in scenari di collaborazione (SQL-Server).

Esempio

Nell'esempio di codice seguente viene illustrato come elaborare i conflitti aggiornamento-aggiornamento in un gestore eventi ApplyChangeFailed. Nell'esempio le righe in conflitto vengono visualizzate nella console con un'opzione per specificare le riga che deve prevalere nel conflitto. Per visualizzare il codice nel contesto di un esempio completo, vedere Procedura: gestire conflitti di dati ed errori per la sincronizzazione in scenari di collaborazione (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

Vedere anche

Riferimento

Classe RelationalSyncProvider
Membri RelationalSyncProvider
Spazio dei nomi Microsoft.Synchronization.Data