Событие RelationalSyncProvider.ApplyChangeFailed
Происходит во время передачи данных, после сбоя применения строки на узле.
Это событие несовместимо с CLS.
Пространство имен: Microsoft.Synchronization.Data
Сборка: Microsoft.Synchronization.Data (в microsoft.synchronization.data.dll)
Синтаксис
'Декларация
Public Event ApplyChangeFailed As EventHandler(Of DbApplyChangeFailedEventArgs)
'Применение
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.
Замечания
Если при синхронизации строка не может быть применена, то вызывается событие ApplyChangeFailed. Объект DbApplyChangeFailedEventArgs содержит сведения об ошибке или конфликте, которые привели к сбою операции. Обработчик события может обработать событие несколькими различными способами, например, указав службе синхронизации, что строку необходимо попытаться применить повторно. Дополнительные сведения см. в разделе Как обрабатывать конфликты и ошибки в данных для синхронизации совместной работы (SQL Server).
Пример
В следующих примерах кода показана обработка конфликтов типа «обновление-обновление» в обработчике события ApplyChangeFailed
. В этом примере конфликтующие строки выводятся на консоль с параметром, который должен определить, в пользу какой строки разрешается конфликт. Чтобы просмотреть этот код в контексте полного примера, см. раздел Как обрабатывать конфликты и ошибки в данных для синхронизации совместной работы (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
См. также
Справочник
Класс RelationalSyncProvider
Элементы RelationalSyncProvider
Пространство имен Microsoft.Synchronization.Data