Поделиться через


Перечисление DbConflictType

Определяет типы конфликтов, возникающих во время синхронизации.

Пространство имен:  Microsoft.Synchronization.Data
Сборка:  Microsoft.Synchronization.Data (в Microsoft.Synchronization.Data.dll)

Синтаксис

'Декларация
Public Enumeration DbConflictType
'Применение
Dim instance As DbConflictType
public enum DbConflictType
public enum class DbConflictType
type DbConflictType
public enum DbConflictType

Элементы

Имя элемента Описание
ErrorsOccurred В одноранговой базе данных возникло исключение в процессе применения изменения.
LocalUpdateRemoteUpdate Локальный и удаленный одноранговые узлы обновили одну и ту же строку.
LocalUpdateRemoteDelete Локальный одноранговый узел обновил строку, которая была удалена удаленным одноранговым узлом.
LocalDeleteRemoteUpdate Локальный одноранговый узел удалил строку, обновленную удаленным одноранговым узлом.
LocalInsertRemoteInsert Локальный и удаленный одноранговые узлы одновременно вставили строку с одним и тем же значением первичного ключа. Это вызвало нарушение первичного ключа.
LocalDeleteRemoteDelete Локальный и удаленный одноранговые узлы удалили одну и ту же строку.
LocalCleanedupDeleteRemoteUpdate Локальный одноранговый узел удалил строку, которая была обновлена на удаленном одноранговом узле, и метаданные этой строки также были удалены.

Замечания

Службы Sync Framework обнаруживают конфликты и ошибки на уровне строк. В строке возникает конфликт, если она изменялась между сеансами синхронизации на нескольких узлах. Ошибки во время синхронизации обычно связаны с нарушением ограничения, например с повторением первичного ключа. Дополнительные сведения см. в разделе Как обрабатывать конфликты и ошибки данных для синхронизации базы данных (SQL Server).

Примеры

В следующих примерах кода показана обработка конфликтов типа «обновление-обновление» в обработчике события ApplyChangeFailed. В этом примере конфликтующие строки выводятся на консоль с параметром, который должен определить, в пользу какой строки разрешается конфликт. Чтобы просмотреть этот код в контексте полного примера, см. раздел Как обрабатывать конфликты и ошибки данных для синхронизации базы данных (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

См. также

Справочник

Пространство имен Microsoft.Synchronization.Data