Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Synchronisation des bases de données SQL Server 2008 sur HTTP à l'aide de WCF &Sync Framework

J'ai fait ce qui suit pour que Sync Framework fonctionne avec WCF avec SQL Server 2008

  • Activation du suivi des modifications dans SQL Server 2008
  • Activation du suivi des modifications pour les tables participant à la synchronisation
  • Ajout d'une table de métadonnées nommée ancre
  • Ajout d'un tableau pour suivre les identifiants client nommé "guid"
  • Utilisation de SqlExpressClientSyncProvider disponible sur le site du projet codeplex de MSF en tant que fournisseur de synchronisation client
  • Utilisation de SqlSyncAdapterBuilder pour créer des adaptateurs pour les tables participant à la synchronisation

    foreach (var item in anchorTables)
    {
        // Use adapter builder to generate T-SQL for querying change tracking data and CRUD
        SqlSyncAdapterBuilder builder = new SqlSyncAdapterBuilder();
        builder.Connection = new SqlConnection(this.connectionStringFactory.ConnectionString);
        builder.ChangeTrackingType = ChangeTrackingType.SqlServerChangeTracking;
        builder.SyncDirection = SyncDirection.Bidirectional;
        builder.TableName = item.TableName;
        // Get sync adapters from builder
        SyncAdapter clientAdapter = builder.ToSyncAdapter();
        clientAdapter.TableName = item.TableName;
        this.clientSyncProvider.SyncAdapters.Add(clientAdapter);
    }
    
  • Ajout de commandes d'ancrage

    SqlCommand anchroCommand =
       new SqlCommand { CommandText = "SELECT @" 
          + SyncSession.SyncNewReceivedAnchor 
          + " = change_tracking_current_version()" };
    
    anchroCommand.Parameters.Add("@" 
          + SyncSession.SyncNewReceivedAnchor, SqlDbType.BigInt)
          .Direction = ParameterDirection.Output;
    
    this.clientSyncProvider.SelectNewAnchorCommand = anchroCommand;
    
  • Implémentation d'un service WCF à l'aide d'une instance de DbServerSyncProvider fonctionnant comme fournisseur de synchronisation de serveur. Vous devrez également générer des adaptateurs de synchronisation et définir la commande d'ancrage comme indiqué à l'étape précédente pour le fournisseur de serveur.

    [ServiceContract]
    public interface ISyncService
    {
        [OperationContract]
        SyncContext ApplyChanges(SyncGroupMetadata groupMetadata, DataSet dataSet, SyncSession syncSession);
        [OperationContract]
        SyncContext GetChanges(SyncGroupMetadata groupMetadata, SyncSession syncSession);
        [OperationContract]
        SyncSchema GetSchema(Collection<string> tableNames, SyncSession syncSession);
        [OperationContract]
        SyncServerInfo GetServerInfo(SyncSession syncSession);
    }
    
  • Création d'une classe proxy implémentant ServerSyncProvider pour accéder au service WCF

    public class DbServerSyncProviderProxy : ServerSyncProvider
    {
        SyncServiceProxy.SyncServiceClient serviceProxy = new SyncServiceProxy.SyncServiceClient();
        public override SyncContext ApplyChanges(SyncGroupMetadata groupMetadata, DataSet dataSet, SyncSession syncSession)
        {
            return serviceProxy.ApplyChanges(groupMetadata, dataSet, syncSession);
        }
    }
    
  • Créé une instance de SyncAgent et défini RemoteProvider avec une instance de classe proxy utilisée pour accéder au service WCF. LocalProvider est défini avec l'instance de SqlExpressClientSyncProvider
  • Ajout de tables et de groupes de synchronisation à la configuration de SyncAgent
  • SyncAgent.Synchronize()