DbConflictType Enumeración
Define los tipos de conflicto que pueden producirse durante la sincronización.
Espacio de nombres: Microsoft.Synchronization.Data
Ensamblado: Microsoft.Synchronization.Data (en microsoft.synchronization.data.dll)
Sintaxis
'Declaración
<SuppressMessageAttribute("Microsoft.Naming", "CA1706:ShortAcronymsShouldBeUppercase")> _
Public Enumeration DbConflictType
'Uso
Dim instance As DbConflictType
[SuppressMessageAttribute("Microsoft.Naming", "CA1706:ShortAcronymsShouldBeUppercase")]
public enum DbConflictType
[SuppressMessageAttribute(L"Microsoft.Naming", L"CA1706:ShortAcronymsShouldBeUppercase")]
public enum class DbConflictType
/** @attribute SuppressMessageAttribute("Microsoft.Naming", "CA1706:ShortAcronymsShouldBeUppercase") */
public enum DbConflictType
SuppressMessageAttribute("Microsoft.Naming", "CA1706:ShortAcronymsShouldBeUppercase")
public enum DbConflictType
Miembros
Nombre del miembro | Descripción | |
---|---|---|
ErrorsOccurred | La base de datos del mismo nivel produjo una excepción durante la aplicación de un cambio. | |
LocalCleanedupDeleteRemoteUpdate | La base de datos remota local eliminó una fila actualizada por la base de datos remota del mismo nivel y se limpiaron los metadatos para esa fila. | |
LocalDeleteRemoteDelete | Las bases de datos del mismo nivel local y remota eliminaron la misma fila. | |
LocalDeleteRemoteUpdate | La base de datos del mismo nivel local eliminó una fila actualizada por la base de datos del mismo nivel remota. | |
LocalInsertRemoteInsert | Las bases de datos del mismo nivel local y remota insertaron una fila que tiene el mismo valor en la clave principal. Se originó así una infracción de la clave principal. | |
LocalUpdateRemoteDelete | La base de datos del mismo nivel local actualizó una fila eliminada por la base de datos del mismo nivel remota. | |
LocalUpdateRemoteUpdate | Las bases de datos del mismo nivel local y remota actualizaron la misma fila. |
Notas
En Sync Framework, los conflictos y los errores se detectan en el nivel de la fila. Una fila tiene un conflicto cuando se ha modificado en más de un nodo entre sincronizaciones. Los errores que se producen durante la sincronización suelen incluir una infracción de restricción, como una clave principal duplicada. Para obtener más información, vea Tratar los conflictos de datos y los errores de la sincronización de colaboración (SQL Server).
Ejemplo
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 colaboración (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