sql >> Base de Datos >  >> RDS >> Sqlserver

Sincronización de bases de datos de SQL Server 2008 a través de HTTP utilizando WCF y Sync Framework

Hice lo siguiente para que Sync Framework funcione usando WCF con SQL Server 2008

  • Seguimiento de cambios habilitado en SQL Server 2008
  • Se habilitó el seguimiento de cambios para las mesas que participan en la sincronización
  • Se agregó una tabla de metadatos llamada ancla
  • Se agregó una tabla para realizar un seguimiento de los ID de los clientes denominada "guid"
  • SqlExpressClientSyncProvider usado disponible en el sitio del proyecto codeplex de MSF como proveedor de sincronización de clientes
  • Usé SqlSyncAdapterBuilder para crear adaptadores para tablas que participan en 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);
    }
    
  • Se agregaron comandos de anclaje

    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;
    
  • Implementó un servicio WCF utilizando una instancia de DbServerSyncProvider que funciona como proveedor de sincronización del servidor. Tendrá que generar adaptadores de sincronización y configurar el comando de anclaje como se muestra en el paso anterior para el proveedor del servidor también.

    [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);
    }
    
  • Creó una clase de proxy que implementa ServerSyncProvider para acceder al servicio 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);
        }
    }
    
  • Se creó una instancia de SyncAgent y se configuró RemoteProvider con una instancia de clase de proxy que se usa para acceder al servicio WCF. LocalProvider se establece con la instancia de SqlExpressClientSyncProvider
  • Se agregaron tablas y grupos de sincronización a la configuración de SyncAgent
  • Agente de sincronización.Synchronize()