使用WCF和Sync Framework通过HTTP同步SQL Server 2008数据库

Raj*_*Raj 23 .net c# sql-server-2008 microsoft-sync-framework

有没有人在这里使用Sync Framework并通过WCF端点进行同步?请分享代码示例或示例项目.我特意寻找离线场景,其中客户端仅在线从服务器获取更新.

Raj*_*Raj 28

我做了以下操作,以使Sync Framework使用WCF与SQL Server 2008一起工作

  • 在SQL Server 2008中启用了更改跟踪
  • 为参与同步的表启用更改跟踪
  • 添加了名为anchor的元数据表
  • 添加了一个表来跟踪名为"guid"的客户端ID
  • 使用MSF的codeplex项目站点提供的SqlExpressClientSyncProvider作为Client Sync Provider
  • 使用SqlSyncAdapterBuilder为参与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);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 添加了锚点命令

    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;
    
    Run Code Online (Sandbox Code Playgroud)
  • 使用DbServerSyncProvider实例作为服务器同步提供程序实现WCF服务.您将生成同步适配器并设置锚命令,如服务器提供程序的上一步所示.

    [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);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 创建了一个实现ServerSyncProvider的代理类来访问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);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 创建了一个SyncAgent实例,并使用代理类实例设置RemoteProvider,该实例用于访问WCF服务.LocalProvider设置了SqlExpressClientSyncProvider的实例
  • 将表和同步组添加到SyncAgent配置
  • SyncAgent.Synchronize()

  • 是的,Sync Framework 2.1的示例项目非常棒! (4认同)