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

23

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

1个回答

28
我采取了以下步骤,以使用WCF和SQL Server 2008使同步框架工作:
  • 启用SQL Server 2008中的更改跟踪
  • 启用参与同步的表的更改跟踪
  • 添加名为“anchor”的元数据表
  • 添加一个跟踪客户端ID的表,命名为“guid”
  • 使用来自MSF代码库网站的SqlExpressClientSyncProvider作为客户端同步提供程序
  • 使用SqlSyncAdapterBuilder为参与同步的表构建适配器

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);
}
  • 添加了锚点命令

  • 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;
    
  • 使用一个作为服务器同步提供程序的 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);
    }
    
  • 创建了一个代理类来实现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);
        }
    }
    
  • 创建了SyncAgent实例,并使用代理类的实例设置RemoteProvider,用于访问WCF服务。LocalProvider使用SqlExpressClientSyncProvider的实例进行设置。
  • 向SyncAgent配置中添加表和同步组。
  • SyncAgent.Synchronize()

  • 谢谢您,先生,这非常有帮助。使用Sync Framework + WCF远程同步如此简单,真是太棒了! - Josh M.

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接