【问题标题】:Syncing SQL Server 2008 Databases over HTTP using WCF & Sync Framework使用 WCF 和同步框架通过 HTTP 同步 SQL Server 2008 数据库
【发布时间】:2010-12-12 00:22:13
【问题描述】:

这里有人使用过 Sync Framework 并通过 WCF 端点进行同步吗?请分享代码示例或示例项目。我专门寻找离线场景,客户端在线只是为了从服务器获取更新。

【问题讨论】:

    标签: c# .net sql-server-2008 microsoft-sync-framework


    【解决方案1】:

    我执行以下操作以使同步框架在 SQL Server 2008 中使用 WCF 工作

    • 在 SQL Server 2008 中启用更改跟踪
    • 为参与同步的表启用更改跟踪
    • 添加了一个名为anchor的元数据表
    • 添加了一个表来跟踪名为“guid”的客户端 ID
    • 使用 MSF 的 codeplex 项目站点提供的 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 远程同步是多么简单。好东西!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多