Procédure pas à pas : extension du cache de base de données locale pour prendre en charge la synchronisation bidirectionnelle
Vous pouvez ajouter un élément Cache de base de données locale à votre projet pour configurer un cache de la base de données SQL Server Compact 3.5 local et générer un jeu de classes partielles qui active Microsoft Synchronization Services pour ADO.NET. Parce que Visual Studio génère des classes partielles, vous pouvez écrire du code pour ajouter des fonctionnalités de synchronisation et conserver toujours la capacité d'afficher et de modifier les paramètres dans la boîte de dialogue Configurer la synchronisation de données. Pour plus d'informations sur les classes partielles, consultez Comment : fractionner une classe en classes partielles (Concepteur de classes).
Par défaut, la boîte de dialogue Configurer la synchronisation de données vous permet de configurer Synchronization Services uniquement pour le téléchargement. Cela signifie qu'après avoir configuré la synchronisation de données, appeler Synchronize() téléchargera uniquement des modifications du serveur vers la base de données client. L'une des méthodes les plus courantes pour étendre le code de synchronisation est de configurer la synchronisation bidirectionnelle. Cela vous permet de télécharger des modifications du client vers le serveur. Pour activer la synchronisation bidirectionnelle, nous vous recommandons d'étendre le code généré en procédant comme suit :
Définissez la direction de la synchronisation sur une synchronisation bidirectionnelle.
Ajoutez du code pour gérer des conflits de synchronisation.
Supprimez des colonnes de suivi du serveur à partir des commandes de synchronisation.
Composants requis
Avant de pouvoir démarrer cette procédure pas à pas, vous devez exécuter Procédure pas à pas : création d'une application occasionnellement connectée. Une fois cette procédure terminée, vous disposez d'un projet qui contient un élément Cache de base de données locale et une application Windows Forms qui vous permet de télécharger les modifications de la table Northwind Customers vers une base de données SQL Server Compact. Vous êtes maintenant prêt à charger cette solution de procédure pas à pas et à ajouter des fonctionnalités bidirectionnelles.
Notes
Il est possible que votre ordinateur affiche des noms ou des emplacements différents pour certains des éléments d'interface utilisateur de Visual Studio dans les instructions suivantes. L'édition de Visual Studio dont vous disposez et les paramètres que vous utilisez déterminent ces éléments. Pour plus d'informations, consultez Paramètres Visual Studio.
Pour ouvrir la solution OCSWalkthrough
Ouvrez Visual Studio
Dans le menu Fichier, ouvrez une solution ou un projet existant et recherchez la solution OCSWalkthrough. Il s'agit du fichier OCSWalkthrough.sln.
Définition de la direction de la synchronisation
La boîte de dialogue Configurer la synchronisation de données vous permet d'affecter à la propriété SyncDirection() la valeur DownloadOnly() ou Snapshot(). Pour activer la synchronisation bidirectionnelle, affectez à la propriété SyncDirection() la valeur Bidirectional() pour chaque table que vous souhaitez activer pour le téléchargement des modifications.
Pour définir la direction de la synchronisation
Cliquez avec le bouton droit sur NorthwindCache.sync et cliquez sur Afficher le code. La première fois que vous faites ceci, Visual Studio crée un fichier NorthwindCache sous le nœud NorthwindCache.sync dans l'Explorateur de solutions. Ce fichier contient une classe partielle de NorthwindCacheSyncAgent et vous pouvez ajouter d'autres classes selon vos besoins.
Dans le fichier de classe de NorthwindCache, ajoutez du code afin que la méthode NorthwindCacheSyncAgent.OnInitialized() ressemble au code suivant :
partial void OnInitialized() { this.Customers.SyncDirection = Microsoft.Synchronization.Data.SyncDirection.Bidirectional; }
Private Sub OnInitialized() Me.Customers.SyncDirection = Microsoft.Synchronization.Data.SyncDirection.Bidirectional End Sub
Ouvrez Form1 dans l'éditeur de code.
Dans le fichier Form1, modifiez la ligne de code dans le gestionnaire d'événements SynchronizeButton_Click afin d'inclure les statistiques de transfert et de téléchargement :
MessageBox.Show("Changes downloaded: " + syncStats.TotalChangesDownloaded.ToString() + Environment.NewLine + "Changes uploaded: " + syncStats.TotalChangesUploaded.ToString());
MessageBox.Show("Changes downloaded: " & _ syncStats.TotalChangesDownloaded.ToString & _ Environment.NewLine & _ "Changes uploaded: " & _ syncStats.TotalChangesUploaded.ToString)
Test de l'application
L'application est à présent configurée pour exécuter à la fois les téléchargements et les transferts pendant la synchronisation.
Pour tester l'application
Appuyez sur F5.
Dans le formulaire, mettez à jour un enregistrement, puis cliquez sur le bouton Enregistrer (l'icône représentant une disquette dans la barre d'outils).
Cliquez sur Synchroniser maintenant.
Une zone de message contenant des informations sur les enregistrements synchronisés s'affiche. Les statistiques indiquent qu'une ligne a été transférée et qu'une ligne a été téléchargée, même si aucune modification n'a été apportée sur le serveur. Le téléchargement supplémentaire se produit parce que des modifications du client sont répétées sur le client après qu'elles soient appliquées sur le serveur. Pour plus d'informations, consultez « Détermination du client qui a effectué une modification de données » dans Comment : utiliser un système de suivi des modifications personnalisées.
Cliquez sur OK pour fermer le message mais laissez s'exécuter l'application.
Vous allez maintenant modifier le même enregistrement à la fois sur le client et sur le serveur pour forcer un conflit (une violation d'accès concurrentiel) pendant la synchronisation.
Pour tester l'application et forcer un conflit
Dans le formulaire, mettez à jour un enregistrement, puis cliquez sur le bouton Enregistrer.
Pendant que l'application est toujours en cours d'exécution, utilisez l'Explorateur de serveurs/Explorateur de bases de données (ou un autre outil de gestion de base de données) pour vous connecter à la base de données serveur distante.
Pour démontrer le comportement par défaut pour la résolution de conflit, dans l'Explorateur de serveurs/Explorateur de bases de données, mettez à jour le même enregistrement que celui mis à jour dans le formulaire, mais modifiez la valeur puis validez la modification. (Quittez la ligne modifiée.)
Revenez au formulaire puis cliquez sur Synchroniser maintenant.
Vérifiez la mise à jour dans la grille de l'application et la base de données de serveur. Notez que la mise à jour que vous avez effectuée sur le serveur a remplacé la mise à jour sur le client. Pour plus d'informations sur la façon de modifier ce comportement de résolution de conflit, consultez la section suivante de cette rubrique, « Ajout de code pour gérer des conflits de synchronisation ».
Ajout de code pour gérer des conflits de synchronisation.
Dans Synchronization Services, une ligne est en conflit si elle est modifiée à la fois sur le client et sur le serveur entre des synchronisations. Par conséquent, Synchronization Services fournit un ensemble de fonctionnalités qui permet de détecter et de résoudre des conflits. Dans cette section, vous allez ajouter la gestion de base pour les conflits dans lesquels la même ligne est mise à jour sur le client et le serveur. D'autres types de conflits incluent une ligne supprimée dans une base de données et mise à jour dans une autre ou des lignes qui ont des clés primaire dupliquées qui sont insérées dans les deux bases de données. Pour plus d'informations sur la détection et la résolution de conflits, consultez Comment : gérer les conflits de données et les erreurs.
Notes
L'exemple de code fournit un exemple de base de gestion de conflit. La manière dont vous gérez des conflits dépend des spécifications de votre application et logique métier.
Ajoutez du code pour gérer l'événement ApplyChangeFailed serveur et l'événement ApplyChangeFailed client. Ces événements sont déclenchés lorsqu'une ligne ne peut pas être appliquée à cause d'un conflit ou d'une erreur. Les méthodes qui gèrent ces événements vérifient le type de conflit et spécifient que les conflits de mise à jour serveur / mise à jour client doivent être résolus en forçant la modification du client à s'écrire dans la base de données du serveur. La commande de synchronisation qui applique les mises à jour dans la base de données du serveur inclut une logique pour reconnaître lorsqu'une modification doit être forcée. Cette commande est incluse dans le code dans la section suivante de cette rubrique, « Suppression des colonnes de suivi du serveur à partir des commandes de synchronization ».
Les étapes à suivre pour ajouter la gestion de conflit diffèrent, selon que vous utilisez C# ou Visual Basic.
Pour ajouter la gestion de conflit
Si vous utilisez C#, ajoutez du code à NorthwindCache.cs et Form1.cs. Dans NorthwindCache.cs, ajoutez le code suivant après la fin de la classe NorthwindCacheSyncAgent :
public partial class NorthwindCacheServerSyncProvider { partial void OnInitialized() { this.ApplyChangeFailed += new System.EventHandler<Microsoft.Synchronization.Data.ApplyChangeFailedEventArgs> (NorthwindCacheServerSyncProvider_ApplyChangeFailed); } private void NorthwindCacheServerSyncProvider_ApplyChangeFailed(object sender, Microsoft.Synchronization.Data.ApplyChangeFailedEventArgs e) { if (e.Conflict.ConflictType == Microsoft.Synchronization.Data.ConflictType.ClientUpdateServerUpdate) { // Resolve a client update / server update conflict by force writing // the client change to the server database. System.Windows.Forms.MessageBox.Show("A client update / server update conflict " + "was detected at the server."); e.Action = Microsoft.Synchronization.Data.ApplyAction.RetryWithForceWrite; } } } public partial class NorthwindCacheClientSyncProvider { public void AddHandlers() { this.ApplyChangeFailed += new System.EventHandler<Microsoft.Synchronization.Data.ApplyChangeFailedEventArgs> (NorthwindCacheClientSyncProvider_ApplyChangeFailed); } private void NorthwindCacheClientSyncProvider_ApplyChangeFailed(object sender, Microsoft.Synchronization.Data.ApplyChangeFailedEventArgs e) { if (e.Conflict.ConflictType == Microsoft.Synchronization.Data.ConflictType.ClientUpdateServerUpdate) { // Resolve a client update / server update conflict by keeping the // client change. e.Action = Microsoft.Synchronization.Data.ApplyAction.Continue; } } }
Dans Form1.cs, modifiez le code dans le gestionnaire d'événements SynchronizeButton_Click afin qu'il appelle la méthode AddHandler que vous avez ajoutée à NorthwindCache.cs dans l'étape précédente :
NorthwindCacheSyncAgent syncAgent = new NorthwindCacheSyncAgent(); NorthwindCacheClientSyncProvider clientSyncProvider = (NorthwindCacheClientSyncProvider)syncAgent.LocalProvider; clientSyncProvider.AddHandlers(); Microsoft.Synchronization.Data.SyncStatistics syncStats = syncAgent.Synchronize();
Si vous utilisez Visual Basic, dans NorthwindCache.vb, ajoutez le code suivant après l'instruction End Class pour la classe NorthwindCacheSyncAgent.
Partial Public Class NorthwindCacheServerSyncProvider Private Sub NorthwindCacheServerSyncProvider_ApplyChangeFailed( _ ByVal sender As Object, ByVal e As _ Microsoft.Synchronization.Data.ApplyChangeFailedEventArgs) _ Handles Me.ApplyChangeFailed If e.Conflict.ConflictType = _ Microsoft.Synchronization.Data.ConflictType.ClientUpdateServerUpdate Then ' Resolve a client update / server update conflict by force writing ' the client change to the server database. MessageBox.Show("A client update / server update" & _ " conflict was detected at the server.") e.Action = Microsoft.Synchronization.Data.ApplyAction.RetryWithForceWrite End If End Sub End Class Partial Public Class NorthwindCacheClientSyncProvider Private Sub NorthwindCacheClientSyncProvider_ApplyChangeFailed( _ ByVal sender As Object, ByVal e As _ Microsoft.Synchronization.Data.ApplyChangeFailedEventArgs) _ Handles Me.ApplyChangeFailed If e.Conflict.ConflictType = _ Microsoft.Synchronization.Data.ConflictType.ClientUpdateServerUpdate Then ' Resolve a client update / server update conflict by keeping the ' client change. e.Action = Microsoft.Synchronization.Data.ApplyAction.Continue End If End Sub End Class
Pour synchroniser et afficher la résolution de conflit
Appuyez sur F5.
Dans le formulaire, mettez à jour un enregistrement, puis cliquez sur le bouton Enregistrer.
Dans l'Explorateur de serveurs/Explorateur de bases de données, mettez à jour le même enregistrement que celui mis à jour dans le formulaire, mais modifiez la valeur, puis validez la modification.
Revenez au formulaire puis cliquez sur Synchroniser maintenant.
Vérifiez la mise à jour dans la grille de l'application et la base de données de serveur. Notez que la mise à jour que vous avez effectuée sur le client a remplacé la mise à jour sur le serveur.
Suppression des colonnes de suivi du serveur à partir des commandes de synchronisation.
Lorsque le Cache de base de données locale est créé, les colonnes utilisées pour suivre les modifications dans la base de données du serveur sont téléchargées sur le client. (Dans cette procédure pas à pas, les colonnes sont CreationDate et LastEditDate.) Pour prendre en charge la synchronisation bidirectionnelle et aider à garantir la convergence des données sur le client et le serveur, supprimez ces colonnes des commandes SQL qui appliquent des modifications à la base de données du serveur. Vous pouvez supprimer également les colonnes des commandes qui sélectionnent les modifications du serveur à appliquer au client, mais cela n'est pas obligatoire. Compte tenu de restrictions sur certaines modifications du schéma dans la base de données client, les colonnes ne peuvent pas être supprimées. Pour plus d'informations sur les commandes de synchronisation, consultez Comment : indiquer un instantané, télécharger, transférer et synchronisation bidirectionnelle
Notes
Si vous utilisez le suivi des modifications SQL Server 2008, les colonnes de suivi ne sont pas ajoutées à vos tables. Dans ce cas, vous ne devez pas modifier les commandes qui appliquent des modifications sur le serveur.
Le code suivant redéfinit deux commandes définies comme propriétés sur l'objet SyncAdapter pour la table Customers : les propriétés InsertCommand() et UpdateCommand(). Les commandes qui ont été générées par la boîte de dialogue Configurer la synchronisation de données contenaient des références aux colonnes CreationDate et LastEditDate. Dans le code suivant, ces commandes sont redéfinies dans la méthode OnInitialized de la classe CustomersSyncAdapter. La propriété DeleteCommand() n'est pas redéfinie parce qu'elle n'affecte pas la colonne CreationDate ou LastEditDate.
Les variables dans chaque commande SQL sont utilisées pour passer des données et des métadonnées entre Synchronization Services, le client et le serveur. Les variables de session suivantes sont utilisées dans les commandes ci-dessous :
@sync\_row\_count: Retourne le nombre des lignes affectées par la dernière opération sur le serveur. Dans les bases de données SQL Server, @@rowcount fournit la valeur pour cette variable.
@sync\_force\_write: Utilisé pour forcer l'application d'une modification qui a échoué en raison d'un conflit ou d'une erreur.
@sync\_last\_received\_anchor: Utilisé pour définir le jeu de modifications à synchroniser pendant une session.
Pour plus d'informations sur les variables de session, consultez Comment : utiliser des variables de session.
Pour supprimer des colonnes de suivi à partir des commandes de synchronisation.
Ajoutez le code suivant à la classe NorthwindCache (NorthwindCache.vb or NorthwindCache.cs) après l'instruction End Class pour la classe NorthwindCacheServerSyncProvider.
public partial class CustomersSyncAdapter { partial void OnInitialized() { // Redefine the insert command so that it does not insert values // into the CreationDate and LastEditDate columns. System.Data.SqlClient.SqlCommand insertCommand = new System.Data.SqlClient.SqlCommand(); insertCommand.CommandText = "INSERT INTO dbo.Customers ([CustomerID], [CompanyName], " + "[ContactName], [ContactTitle], [Address], [City], [Region], [PostalCode], " + "[Country], [Phone], [Fax] )" + "VALUES (@CustomerID, @CompanyName, @ContactName, @ContactTitle, @Address, @City, " + "@Region, @PostalCode, @Country, @Phone, @Fax) SET @sync_row_count = @@rowcount"; insertCommand.CommandType = System.Data.CommandType.Text; insertCommand.Parameters.Add("@CustomerID", System.Data.SqlDbType.NChar); insertCommand.Parameters.Add("@CompanyName", System.Data.SqlDbType.NVarChar); insertCommand.Parameters.Add("@ContactName", System.Data.SqlDbType.NVarChar); insertCommand.Parameters.Add("@ContactTitle", System.Data.SqlDbType.NVarChar); insertCommand.Parameters.Add("@Address", System.Data.SqlDbType.NVarChar); insertCommand.Parameters.Add("@City", System.Data.SqlDbType.NVarChar); insertCommand.Parameters.Add("@Region", System.Data.SqlDbType.NVarChar); insertCommand.Parameters.Add("@PostalCode", System.Data.SqlDbType.NVarChar); insertCommand.Parameters.Add("@Country", System.Data.SqlDbType.NVarChar); insertCommand.Parameters.Add("@Phone", System.Data.SqlDbType.NVarChar); insertCommand.Parameters.Add("@Fax", System.Data.SqlDbType.NVarChar); insertCommand.Parameters.Add("@sync_row_count", System.Data.SqlDbType.Int); insertCommand.Parameters["@sync_row_count"].Direction = System.Data.ParameterDirection.Output; this.InsertCommand = insertCommand; // Redefine the update command so that it does not update values // in the CreationDate and LastEditDate columns. System.Data.SqlClient.SqlCommand updateCommand = new System.Data.SqlClient.SqlCommand(); updateCommand.CommandText = "UPDATE dbo.Customers SET [CompanyName] = @CompanyName, [ContactName] " + "= @ContactName, [ContactTitle] = @ContactTitle, [Address] = @Address, [City] " + "= @City, [Region] = @Region, [PostalCode] = @PostalCode, [Country] = @Country, " + "[Phone] = @Phone, [Fax] = @Fax " + "WHERE ([CustomerID] = @CustomerID) AND (@sync_force_write = 1 " + "OR ([LastEditDate] <= @sync_last_received_anchor)) SET @sync_row_count = @@rowcount"; updateCommand.CommandType = System.Data.CommandType.Text; updateCommand.Parameters.Add("@CompanyName", System.Data.SqlDbType.NVarChar); updateCommand.Parameters.Add("@ContactName", System.Data.SqlDbType.NVarChar); updateCommand.Parameters.Add("@ContactTitle", System.Data.SqlDbType.NVarChar); updateCommand.Parameters.Add("@Address", System.Data.SqlDbType.NVarChar); updateCommand.Parameters.Add("@City", System.Data.SqlDbType.NVarChar); updateCommand.Parameters.Add("@Region", System.Data.SqlDbType.NVarChar); updateCommand.Parameters.Add("@PostalCode", System.Data.SqlDbType.NVarChar); updateCommand.Parameters.Add("@Country", System.Data.SqlDbType.NVarChar); updateCommand.Parameters.Add("@Phone", System.Data.SqlDbType.NVarChar); updateCommand.Parameters.Add("@Fax", System.Data.SqlDbType.NVarChar); updateCommand.Parameters.Add("@CustomerID", System.Data.SqlDbType.NChar); updateCommand.Parameters.Add("@sync_force_write", System.Data.SqlDbType.Bit); updateCommand.Parameters.Add("@sync_last_received_anchor", System.Data.SqlDbType.DateTime); updateCommand.Parameters.Add("@sync_row_count", System.Data.SqlDbType.Int); updateCommand.Parameters["@sync_row_count"].Direction = System.Data.ParameterDirection.Output; this.UpdateCommand = updateCommand; } }
Partial Public Class CustomersSyncAdapter Private Sub OnInitialized() ' Redefine the insert command so that it does not insert values ' into the CreationDate and LastEditDate columns. Dim insertCommand As New System.Data.SqlClient.SqlCommand With insertCommand .CommandText = "INSERT INTO dbo.Customers ([CustomerID], [CompanyName], " & _ "[ContactName], [ContactTitle], [Address], [City], [Region], [PostalCode], " & _ "[Country], [Phone], [Fax] )" & _ "VALUES (@CustomerID, @CompanyName, @ContactName, @ContactTitle, @Address, @City, " & _ "@Region, @PostalCode, @Country, @Phone, @Fax) SET @sync_row_count = @@rowcount" .CommandType = System.Data.CommandType.Text .Parameters.Add("@CustomerID", System.Data.SqlDbType.NChar) .Parameters.Add("@CompanyName", System.Data.SqlDbType.NVarChar) .Parameters.Add("@ContactName", System.Data.SqlDbType.NVarChar) .Parameters.Add("@ContactTitle", System.Data.SqlDbType.NVarChar) .Parameters.Add("@Address", System.Data.SqlDbType.NVarChar) .Parameters.Add("@City", System.Data.SqlDbType.NVarChar) .Parameters.Add("@Region", System.Data.SqlDbType.NVarChar) .Parameters.Add("@PostalCode", System.Data.SqlDbType.NVarChar) .Parameters.Add("@Country", System.Data.SqlDbType.NVarChar) .Parameters.Add("@Phone", System.Data.SqlDbType.NVarChar) .Parameters.Add("@Fax", System.Data.SqlDbType.NVarChar) .Parameters.Add("@sync_row_count", System.Data.SqlDbType.Int) .Parameters("@sync_row_count").Direction = ParameterDirection.Output End With Me.InsertCommand = insertCommand ' Redefine the update command so that it does not update values ' in the CreationDate and LastEditDate columns. Dim updateCommand As New System.Data.SqlClient.SqlCommand With updateCommand .CommandText = "UPDATE dbo.Customers SET [CompanyName] = @CompanyName, [ContactName] " & _ "= @ContactName, [ContactTitle] = @ContactTitle, [Address] = @Address, [City] " & _ "= @City, [Region] = @Region, [PostalCode] = @PostalCode, [Country] = @Country, " & _ "[Phone] = @Phone, [Fax] = @Fax " & _ "WHERE ([CustomerID] = @CustomerID) AND (@sync_force_write = 1 " & _ "OR ([LastEditDate] <= @sync_last_received_anchor)) SET @sync_row_count = @@rowcount" .CommandType = System.Data.CommandType.Text .Parameters.Add("@CompanyName", System.Data.SqlDbType.NVarChar) .Parameters.Add("@ContactName", System.Data.SqlDbType.NVarChar) .Parameters.Add("@ContactTitle", System.Data.SqlDbType.NVarChar) .Parameters.Add("@Address", System.Data.SqlDbType.NVarChar) .Parameters.Add("@City", System.Data.SqlDbType.NVarChar) .Parameters.Add("@Region", System.Data.SqlDbType.NVarChar) .Parameters.Add("@PostalCode", System.Data.SqlDbType.NVarChar) .Parameters.Add("@Country", System.Data.SqlDbType.NVarChar) .Parameters.Add("@Phone", System.Data.SqlDbType.NVarChar) .Parameters.Add("@Fax", System.Data.SqlDbType.NVarChar) .Parameters.Add("@CustomerID", System.Data.SqlDbType.NChar) .Parameters.Add("@sync_force_write", System.Data.SqlDbType.Bit) .Parameters.Add("@sync_last_received_anchor", System.Data.SqlDbType.DateTime) .Parameters.Add("@sync_row_count", System.Data.SqlDbType.Int) .Parameters("@sync_row_count").Direction = ParameterDirection.Output End With Me.UpdateCommand = updateCommand End Sub End Class
Test de l'application
Pour synchroniser et afficher une mise à jour de la colonne du suivi
Appuyez sur F5.
Sur le formulaire, mettez à jour un enregistrement en modifiant une valeur dans la colonne LastEditDate, puis cliquez sur le bouton Enregistrer.
Revenez au formulaire et cliquez sur Synchroniser maintenant.
Vérifiez la mise à jour dans la grille de l'application et la base de données de serveur. Notez que la valeur de la colonne du serveur a remplacé la mise à jour sur le client. Le processus de mise à jour est le suivant :
Synchronization Services détermine qu'une ligne a été modifiée sur le client.
Pendant la synchronisation, la ligne est téléchargée et appliquée à la table dans la base de données du serveur. Toutefois, les colonnes de suivi ne sont pas incluses dans l'instruction de mise à jour. Synchronization Services exécute en réalité un « exemple de mise à jour » sur la table.
La ligne est à présent répétée sur le client, mais les commandes qui sélectionnent les modifications du serveur incluent maintenant les colonnes de suivi. Par conséquent, la modification apportée sur le client est remplacée par la valeur du serveur.
Étapes suivantes
Dans cette procédure pas à pas, vous avez configuré la synchronisation bidirectionnelle avec gestion de conflit de base et vous avez traité du problème potentiel d'avoir des colonnes de suivi du serveur dans la base de données client. En utilisant des classes partielles, vous pouvez étendre le code Cache de base de données locale dans d'autres modes d'utilisation significatifs. Par exemple, vous pouvez redéfinir les commandes SQL qui sélectionnent des modifications à partir de la base de données du serveur afin de filtrer les données lorsqu'elles sont téléchargées vers le client. Nous vous recommandons de lire les rubriques "Comment" dans cette documentation pour comprendre les modes d'utilisation dans lesquels vous pouvez ajouter ou modifier le code de synchronisation pour satisfaire les besoins de vos applications. Pour plus d'informations, consultez Comment programmer des tâches de synchronisation serveur et client courantes.
Voir aussi
Concepts
Vue d'ensemble des applications occasionnellement connectées
Autres ressources
Comment programmer des tâches de synchronisation serveur et client courantes
Outils pour vous aider à développer des applications (Synchronization Services)