SQL Server 2008 で WCF を使用して Sync Framework を動作させるために、次のことを行いました
- SQL Server 2008 で有効な変更追跡
- 同期に参加しているテーブルの変更追跡を有効にしました
- anchor という名前のメタデータ テーブルを追加しました
- 「guid」という名前のクライアント ID を追跡するテーブルを追加しました
- MSF の codeplex プロジェクト サイトからクライアント同期プロバイダーとして入手できる SqlExpressClientSyncProvider を使用 <リ>
SqlSyncAdapterBuilder を使用して、同期に参加するテーブルのアダプターを構築しました
foreach (anchorTables の var item){ // アダプター ビルダーを使用して、変更追跡データと CRUD をクエリするための T-SQL を生成します SqlSyncAdapterBuilder builder =new SqlSyncAdapterBuilder(); builder.Connection =new SqlConnection(this.connectionStringFactory.ConnectionString); builder.ChangeTrackingType =ChangeTrackingType.SqlServerChangeTracking; builder.SyncDirection =SyncDirection.Bidirectional; builder.TableName =item.TableName; // ビルダー 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) .方向 =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
プレ> <リ>tableNames, SyncSession syncSession); [OperationContract] SyncServerInfo GetServerInfo(SyncSession syncSession);} WCF サービスにアクセスするために ServerSyncProvider を実装するプロキシ クラスを作成しました
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 のインスタンスを作成し、WCF サービスへのアクセスに使用されるプロキシ クラスのインスタンスで RemoteProvider を設定しました。 LocalProvider は SqlExpressClientSyncProvider のインスタンスで設定されます テーブルと同期グループを SyncAgent 構成に追加 SyncAgent.Synchronize()