Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Synchronisieren von SQL Server 2008-Datenbanken über HTTP mit WCF &Sync Framework

Ich habe Folgendes getan, um Sync Framework mithilfe von WCF mit SQL Server 2008 zum Laufen zu bringen

  • Aktivierte Änderungsverfolgung in SQL Server 2008
  • Aktivierte Änderungsverfolgung für Tabellen, die an der Synchronisierung teilnehmen
  • Hinzugefügt eine Metadatentabelle namens Anker
  • Hinzugefügt wurde eine Tabelle namens "guid" zum Verfolgen von Client-IDs
  • Verwendeter SqlExpressClientSyncProvider, der auf der Codeplex-Projektseite von MSF als Client-Synchronisierungsanbieter verfügbar ist
  • Verwendung von SqlSyncAdapterBuilder zum Erstellen von Adaptern für Tabellen, die an der Synchronisierung teilnehmen

    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);
    }
    
  • Ankerbefehle hinzugefügt

    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;
    
  • Implementiert einen WCF-Dienst mit einer Instanz von DbServerSyncProvider, die als Serversynchronisierungsanbieter fungiert. Sie müssen auch für den Serveranbieter Synchronisierungsadapter generieren und den Ankerbefehl festlegen, wie im vorherigen Schritt gezeigt.

    [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);
    }
    
  • Erstellt eine Proxy-Klasse, die ServerSyncProvider implementiert, um auf den WCF-Dienst zuzugreifen

    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);
        }
    }
    
  • Eine Instanz von SyncAgent erstellt und RemoteProvider mit einer Instanz der Proxy-Klasse festgelegt, die für den Zugriff auf den WCF-Dienst verwendet wird. LocalProvider wird mit der Instanz von SqlExpressClientSyncProvider
  • festgelegt
  • Tabellen und Synchronisierungsgruppen zur SyncAgent-Konfiguration hinzugefügt
  • SyncAgent.Synchronize()