sql >> Databasteknik >  >> RDS >> Sqlserver

Synkronisera SQL Server 2008-databaser över HTTP med WCF &Sync Framework

Jag gjorde följande för att få Sync Framework att fungera med WCF med SQL Server 2008

  • Aktiverat ändringsspårning i SQL Server 2008
  • Aktiverat ändringsspårning för tabeller som deltar i synkroniseringen
  • Lade till en metadatatabell med namnet ankare
  • Lade till en tabell för att spåra klient-ID med namnet "guid"
  • Använd SqlExpressClientSyncProvider tillgänglig från MSF:s codeplex-projektwebbplats som Client Sync Provider
  • Använde SqlSyncAdapterBuilder för att bygga adaptrar för tabeller som deltar i 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);
    }
    
  • Lade till ankarkommandon

    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;
    
  • Implementerade en WCF-tjänst med en instans av DbServerSyncProvider som fungerar som serversynkroniseringsleverantör. Du kommer att skapa synkadaptrar och ställa in ankarkommando som visas i föregående steg för serverleverantören också.

    [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);
    }
    
  • Skapat en proxyklass som implementerar ServerSyncProvider för att komma åt WCF-tjänsten

    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);
        }
    }
    
  • Skapade en instans av SyncAgent och ställde in RemoteProvider med en instans av proxyklass som används för att komma åt WCF-tjänsten. LocalProvider är inställd med instans av SqlExpressClientSyncProvider
  • Tabeller och synkroniseringsgrupper har lagts till i SyncAgent-konfigurationen
  • SyncAgent.Synchronize()



  1. MySQL; Bästa datatypen för stora antal

  2. Skapa mer än en procedur i en SQL-fil?

  3. Hur väntar man i 2 sekunder?

  4. Springboot postgres Det gick inte att fastställa en lämplig förarklass