sql >> Database teknologi >  >> RDS >> Sqlserver

Synkronisering af SQL Server 2008-databaser over HTTP ved hjælp af WCF &Sync Framework

Jeg gjorde følgende for at få Sync Framework til at fungere ved hjælp af WCF med SQL Server 2008

  • Aktiveret ændringssporing i SQL Server 2008
  • Aktiveret ændringssporing for tabeller, der deltager i synkroniseringen
  • Tilføjede en metadatatabel med navnet anker
  • Tilføjede en tabel for at spore klient-id'er med navnet "guid"
  • Brugt SqlExpressClientSyncProvider tilgængelig fra MSF's codeplex-projektwebsted som Client Sync Provider
  • Brugte SqlSyncAdapterBuilder til at bygge adaptere til tabeller, der deltager 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);
    }
    
  • Tilføjede ankerkommandoer

    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;
    
  • Implementerede en WCF-tjeneste ved hjælp af en instans af DbServerSyncProvider, der fungerer som serversynkroniseringsudbyder. Du skal generere synkroniseringsadaptere og indstille ankerkommando som vist i forrige trin for serverudbyder også.

    [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);
    }
    
  • Oprettet en proxy-klasse, der implementerede ServerSyncProvider for at få adgang til WCF-tjenesten

    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);
        }
    }
    
  • Oprettede en forekomst af SyncAgent og indstillede RemoteProvider med en forekomst af proxyklasse, som bruges til at få adgang til WCF-tjenesten. LocalProvider er indstillet med forekomst af SqlExpressClientSyncProvider
  • Tilføjede tabeller og synkroniseringsgrupper til SyncAgent-konfigurationen
  • SyncAgent.Synchronize()



  1. Oracle:Java-lagret procedure, der sender JMS-besked

  2. MySQL-funktion til at finde antallet af arbejdsdage mellem to datoer

  3. Vil UUID som primær nøgle i PostgreSQL give dårlig indeksydelse?

  4. Optimering af databasehastighed:få tabeller med mange rækker, eller mange tabeller med få rækker?