sql >> Database >  >> RDS >> Sqlserver

Synchroniseren van SQL Server 2008-databases via HTTP met behulp van WCF &Sync Framework

Ik heb het volgende gedaan om Sync Framework te laten werken met WCF met SQL Server 2008

  • Ingeschakeld Wijzigingen bijhouden in SQL Server 2008
  • Bijhouden van wijzigingen ingeschakeld voor tabellen die deelnemen aan de synchronisatie
  • Een tabel met metagegevens toegevoegd met de naam anker
  • Een tabel toegevoegd om client-ID's bij te houden met de naam "guid"
  • Gebruikte SqlExpressClientSyncProvider beschikbaar op de codeplex-projectsite van Artsen Zonder Grenzen als Client Sync Provider
  • SqlSyncAdapterBuilder gebruikt om adapters te bouwen voor tabellen die deelnemen aan de 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);
    }
    
  • Ankercommando's toegevoegd

    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;
    
  • Een WCF-service geïmplementeerd met behulp van een instantie van DbServerSyncProvider die functioneert als serversynchronisatieprovider. U zult ook synchronisatieadapters moeten genereren en het ankercommando moeten instellen zoals getoond in de vorige stap voor de serverprovider.

    [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);
    }
    
  • Een proxyklasse gemaakt die ServerSyncProvider implementeert om toegang te krijgen tot de WCF-service

    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);
        }
    }
    
  • Een instantie van SyncAgent gemaakt en RemoteProvider ingesteld met een instantie van de proxyklasse die wordt gebruikt om toegang te krijgen tot de WCF-service. LocalProvider is ingesteld met instantie van SqlExpressClientSyncProvider
  • Tabellen en synchronisatiegroepen toegevoegd aan SyncAgent-configuratie
  • SyncAgent.Synchronize()



  1. Docker - Postgres en pgAdmin 4:Verbinding geweigerd

  2. Zoek de datum/tijd waarop de kolom van een tabel is gemaakt

  3. Detecteer SQL-eiland over meerdere parameters en voorwaarden

  4. Type komt niet overeen:kan niet converteren van java.util.Date naar java.sql.Date