Procédure pas à pas : exécution de la synchronisation pour l'étendue filtrée [SQL Express]
Dans cette procédure pas à pas, vous allez créer une application console qui synchronise la base de données SyncExpressDB avec la base de données SyncDB. Pour obtenir des détails techniques approfondis sur l'approvisionnement des serveurs/clients et l'exécution du processus de synchronisation, consultez Procédure : configurer et exécuter la synchronisation de bases de données (SQL Server).
Pour exécuter la synchronisation
Dans l'Explorateur de solutions, cliquez avec le bouton droit sur Solution ‘SyncSQLServerAndSQLExpress’, pointez sur Ajouter, puis cliquez sur Nouveau projet.
Sélectionnez Visual C# dans Types de projet et Application console dans Modèles.
Tapez ExecuteExpressFilteredSync pour Nom du projet.
Cliquez sur OK pour fermer la boîte de dialogue Nouveau projet.
Dans la fenêtre Explorateur de solutions, cliquez avec le bouton droit sur ExecuteExpressFilteredSync, puis cliquez sur Ajouter une référence.
Sélectionnez Microsoft.Synchronization, Microsoft.Synchornization.Data, Microsoft.Synchronization.Data.SqlServer sous l'onglet .NET, et cliquez sur OK pour fermer la boîte de dialogue Ajouter une référence.
Ajoutez les instructions using suivantes au début du fichier Program.cs après les instructions using existantes.
using System.Data; using System.Data.SqlClient; using Microsoft.Synchronization; using Microsoft.Synchronization.Data; using Microsoft.Synchronization.Data.SqlServer;
Ajoutez l'instruction suivante à la méthode Main pour créer une connexion SQL à la base de données Express.
// connect to the SQL Express database SqlConnection clientConn = new SqlConnection(@"Data Source=.\SQLEXPRESS; Initial Catalog=SyncExpressDB; Trusted_Connection=Yes");
Ajoutez l'instruction suivante à la méthode Main pour créer une connexion SQL à la base de données serveur.
// connect to the server database SqlConnection serverConn = new SqlConnection("Data Source=localhost; Initial Catalog=SyncDB; Integrated Security=True");
Important
Dans l'instruction ci-dessus, remplacez le nom du serveur par le nom d'instance de votre serveur, si vous n'utilisez pas l'instance par défaut. Par exemple, si votre instance SQL Server se nomme MYSQLINSTANCE, remplacez (local) par .\MYSQLINSTANCE.
Ajoutez le code suivant à la méthode Main pour créer un orchestrateur de synchronisation, qui initialise et contrôle les sessions de synchronisation. L'orchestrateur de synchronisation contient deux fournisseurs de synchronisation qui participent à une session de synchronisation. Dans notre scénario, vous devez utiliser un objet fournisseur pour la base de données serveur et un objet fournisseur pour la base de données client Express. Les étapes de niveau supérieur de la création d'un orchestrateur pour ce scénario sont les suivantes :
Créez une instance de la classe SyncOrchestrator. La classe SyncOrchestrator initialise et contrôle les sessions de synchronisation.
Affectez au fournisseur local de l'objet orchestrateur de synchronisation un objet SqlSyncProvider associé à la base de données client SyncExpressDB. La classe SqlSyncProvider encapsule un fournisseur de synchronisation pour une base de données SQL Express qui communique avec le client et protège l'orchestrateur de synchronisation contre l'implémentation spécifique de la base de données client.
Affectez au fournisseur distant de l'orchestrateur de synchronisation un objet SqlSyncProvider associé à la base de données serveur SyncDB. La classe SqlSyncProvider représente un fournisseur de synchronisation qui communique avec une base de données SQL Server et protège les autres composants Sync Framework contre l'implémentation spécifique de la base de données.
Définissez UploadAndDownload comme direction de synchronisation de l'objet orchestrateur de synchronisation afin que le client puisse procéder à un téléchargement ascendant/descendant des modifications vers/depuis le serveur.
// create a sync orchestration object SyncOrchestrator syncOrchestrator = new SyncOrchestrator(); // set the local provider of sync orchestrator to a sync provider that is // associated with the OrdersScope-NC scope in the SyncExpressDB database syncOrchestrator.LocalProvider = new SqlSyncProvider("OrdersScope-NC", clientConn); // set the remote provider of sync orchestrator to a server sync provider that is // associated with the OrdersScope-NC scope in the SyncDB database syncOrchestrator.RemoteProvider = new SqlSyncProvider("OrdersScope-NC", serverConn); // set the direction to Upload and Download syncOrchestrator.Direction = SyncDirectionOrder.UploadAndDownload;
Ajoutez le code suivant pour souscrire à toute erreur survenant lorsque vous appliquez des modifications au client. L'événement ApplyChangeFailed est déclenché lorsqu'une ligne n'a pas pu être appliquée à un client. Vous allez définir le gestionnaire de cet événement d'erreur dans la suite de cette procédure.
// subscribe for errors that occur when applying changes to the client ((SqlCeSyncProvider)syncOrchestrator.LocalProvider).ApplyChangeFailed += new EventHandler<DbApplyChangeFailedEventArgs>(Program_ApplyChangeFailed);
Ajoutez l'instruction suivante à la méthode Main pour exécuter la synchronisation entre SQL Server et SQL Express. Ce code appelle la méthode Synchronize()()()() sur l'objet SyncOrchestrator pour démarrer le processus de synchronisation entre la base de données serveur SyncDB et la base de données Express SyncExpressDB.
// starts the synchornization session SyncOperationStatistics syncStats = syncOrchestrator.Synchronize();
Ajoutez les instructions suivantes à la méthode Main pour afficher les statistiques de la session de synchronisation. L'objet SyncOperationStatistics retourné par cette méthode contient des statistiques sur la session de synchronisation exécutée.
// prints statistics from the sync session Console.WriteLine("Start Time: " + syncStats.SyncStartTime); Console.WriteLine("Total Changes Uploaded: " + syncStats.UploadChangesTotal); Console.WriteLine("Total Changes Downloaded: " + syncStats.DownloadChangesTotal); Console.WriteLine("Complete Time: " + syncStats.SyncEndTime); Console.WriteLine(String.Empty);
Ajoutez la méthode de gestionnaire d'événements suivante à la classe Program à la suite de la méthode Main pour gérer l'événement ApplyChangeFailed. (Le paramètre DbApplyChangeFailedEventArgs fournit des informations sur l'erreur ou le conflit à l'origine de l'échec. Dans un gestionnaire pour l'événement, vous pouvez répondre à l'événement de différentes façons, notamment en indiquant si le fournisseur de synchronisation doit essayer d'appliquer à nouveau la ligne. La propriété Error de l'objet contient des métadonnées relatives aux exceptions qui se sont produites au cours de la synchronisation. L'exemple de code suivant affiche cette erreur et le type de conflit (de type DbConflictType) survenu lors de la synchronisation.
static void Program_ApplyChangeFailed(object sender, DbApplyChangeFailedEventArgs e) { // display conflict type Console.WriteLine(e.Conflict.Type); // display error message Console.WriteLine(e.Error); }
Dans l'Explorateur de solutions, cliquez avec le bouton droit sur ExecuteExpressFilteredSync, puis sélectionnez Générer.
Dans l'Explorateur de solutions, cliquez à nouveau avec le bouton droit sur ExecuteExpressFilteredSync, puis cliquez sur Définir comme projet de démarrage.
Avertissement
Si vous n'effectuez pas cette étape et que vous appuyez à nouveau sur Ctrl+F5, l'application ProvisionFilteredScopeClient est exécutée une nouvelle fois et vous obtenez un message d'erreur sur l'étendue qui existe déjà dans la base de données client.
Appuyez sur Ctrl+F5 pour exécuter le programme. La sortie doit ressembler à ce qui suit :
Start Time: 6/14/2010 6:24:19 PM Total Changes Uploaded: 0 Total Changes Downloaded: 2 Complete Time: 6/14/2010 6:24:22 PM Press any key to continue . . .
Les deux enregistrements avec la valeur ‘NC’ définie pour la colonne OriginalState sont téléchargés à partir de la table Orders de la base de données serveur SyncDB vers le client Express.
Appuyez sur ENTRÉE pour fermer la fenêtre d'invite de commandes.
Dans SQL Server Management Studio, sélectionnez .\SQLEXPRESS.
Cliquez sur Nouvelle requête dans la barre d'outils.
Tapez et exécutez (en appuyant sur F5) la commande SQL suivante pour confirmer que les enregistrements sont bien téléchargés vers le client Express.
select * from Orders
Vous pouvez vous exercer pour vous familiariser avec la technologie Sync Framework en ajoutant/mettant à jour/supprimant des enregistrements sur le serveur/client. Par exemple, si vous supprimez un enregistrement sur le serveur, l'enregistrement correspondant dans la base de données client doit être supprimé la prochaine fois que vous synchronisez le client avec le serveur.
Exemple de code complet
using System;
using System.Data;
using System.Data.SqlClient;
using Microsoft.Synchronization;
using Microsoft.Synchronization.Data;
using Microsoft.Synchronization.Data.SqlServer;
namespace ExecuteExpressFilteredSync
{
class Program
{
static void Main(string[] args)
{
// connect to the SQL Express database
SqlConnection clientConn = new SqlConnection(@"Data Source=.\SQLEXPRESS; Initial Catalog=SyncExpressDB; Trusted_Connection=Yes");
// connect to the server database
SqlConnection serverConn = new SqlConnection("Data Source=localhost; Initial Catalog=SyncDB; Integrated Security=True");
// create a sync orchestration object
SyncOrchestrator syncOrchestrator = new SyncOrchestrator();
// set the local provider of sync orchestrator to a sync provider that is
// associated with the OrdersScope-NC scope in the SyncExpressDB database
syncOrchestrator.LocalProvider = new SqlSyncProvider("OrdersScope-NC", clientConn);
// set the remote provider of sync orchestrator to a server sync provider that is
// associated with the OrdersScope-NC scope in the SyncDB database
syncOrchestrator.RemoteProvider = new SqlSyncProvider("OrdersScope-NC", serverConn);
// set the direction to Upload and Download
syncOrchestrator.Direction = SyncDirectionOrder.UploadAndDownload;
// subscribe for errors that occur when applying changes to the client
((SqlCeSyncProvider)syncOrchestrator.LocalProvider).ApplyChangeFailed += new EventHandler<DbApplyChangeFailedEventArgs>(Program_ApplyChangeFailed);
// starts the synchornization session
SyncOperationStatistics syncStats = syncOrchestrator.Synchronize();
// prints statistics from the sync session
Console.WriteLine("Start Time: " + syncStats.SyncStartTime);
Console.WriteLine("Total Changes Uploaded: " + syncStats.UploadChangesTotal);
Console.WriteLine("Total Changes Downloaded: " + syncStats.DownloadChangesTotal);
Console.WriteLine("Complete Time: " + syncStats.SyncEndTime);
Console.WriteLine(String.Empty);
}
static void Program_ApplyChangeFailed(object sender, DbApplyChangeFailedEventArgs e)
{
// display conflict type
Console.WriteLine(e.Conflict.Type);
// display error message
Console.WriteLine(e.Error);
}
}
}
Voir aussi
Autres ressources
Procédure : configurer et exécuter la synchronisation de bases de données (SQL Server)