Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Sincronizando bancos de dados do SQL Server 2008 sobre HTTP usando WCF e Sync Framework


Eu fiz o seguinte para que o Sync Framework funcionasse usando o WCF com o SQL Server 2008
  • Controle de alterações ativado no SQL Server 2008
  • Rastreamento de alterações ativado para tabelas que participam da sincronização
  • Adicionou uma tabela de metadados chamada âncora
  • Adicionou uma tabela para rastrear IDs de cliente chamada "guid"
  • Usado SqlExpressClientSyncProvider disponível no site do projeto codeplex de MSF como provedor de sincronização de cliente

  • SqlSyncAdapterBuilder usado para construir adaptadores para tabelas que participam do Sync
    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);
    }
    

  • Comandos de âncora adicionados
    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;
    

  • Implementou um serviço WCF usando uma instância de DbServerSyncProvider funcionando como provedor de sincronização de servidor. Você também terá que gerar adaptadores de sincronização e definir o comando de âncora conforme mostrado na etapa anterior para o provedor do servidor.
    [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);
    }
    

  • Criou uma classe de proxy implementando ServerSyncProvider para acessar o serviço 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);
        }
    }
    
  • Criado uma instância do SyncAgent e definido RemoteProvider com uma instância da classe proxy que é usada para acessar o serviço WCF. LocalProvider é definido com a instância de SqlExpressClientSyncProvider
  • Adicionar tabelas e grupos de sincronização à configuração do SyncAgent
  • SyncAgent.Synchronize()