Énumération DbConflictType
Définit les types de conflits qui peuvent se produire au cours d'une synchronisation.
Espace de noms : Microsoft.Synchronization.Data
Assembly : Microsoft.Synchronization.Data (dans Microsoft.Synchronization.Data.dll)
Syntaxe
'Déclaration
Public Enumeration DbConflictType
'Utilisation
Dim instance As DbConflictType
public enum DbConflictType
public enum class DbConflictType
type DbConflictType
public enum DbConflictType
Membres
Nom de membre | Description | |
---|---|---|
ErrorsOccurred | La base de données d'homologues a levé une exception lors de l'application d'une modification. | |
LocalUpdateRemoteUpdate | Les homologues local et distant ont tous deux mis à jour la même ligne. | |
LocalUpdateRemoteDelete | L'homologue local a mis à jour une ligne que l'homologue distant a supprimée. | |
LocalDeleteRemoteUpdate | L'homologue local a supprimé une ligne que l'homologue distant a mise à jour. | |
LocalInsertRemoteInsert | Les homologues local et distant ont tous deux inséré une ligne qui possède la même valeur de clé primaire. Cela a généré une violation de clé primaire. | |
LocalDeleteRemoteDelete | Les homologues local et distant ont tous deux supprimé la même ligne. | |
LocalCleanedupDeleteRemoteUpdate | L'homologue local a supprimé une ligne mise à jour par l'homologue distant, et les métadonnées de cette ligne ont été nettoyées. |
Notes
Dans Sync Framework, les conflits et les erreurs sont détectés au niveau de la ligne. Une ligne est en conflit lorsqu'elle a été modifiée sur plusieurs nœuds entre les synchronisations. Les erreurs qui se produisent lors de la synchronisation impliquent en règle générale une violation de contrainte, telle qu'une clé primaire en double. Pour plus d'informations, consultez Procédure : gérer les conflits de données et les erreurs pour la synchronisation de bases de données (SQL Server).
Exemples
Les exemples de code suivants montrent comment les conflits de mise à jour-mise à jour peuvent être traités dans un gestionnaire d'événements ApplyChangeFailed. Dans l'exemple, les lignes en conflit sont affichées sur la console avec une option pour spécifier la ligne doit gagner le conflit. Pour afficher ce code dans le contexte d'un exemple complet, consultez Procédure : gérer les conflits de données et les erreurs pour la synchronisation de bases de données (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