Microsoft Sync Services for ADO.NET 是 Microsoft Sync Framework 的一个插件,它使用 ADO.NET 技术在数据库(其实也可以是可以可以抽象或者转化为 ASO.NET 可访问的数据源)之间进行同步。

Sync Services for ADO.NET provider 应用场景

  • C\S结构的离线应用,在本地缓存中心数据库中的部分数据(极特别的情况下会缓存全部)。应用程序使用缓存的数据,并在特定的时间把一批更改上次到中心数据库。
  • 协作应用,应用程序只使用本地数据,并周期性的与其他参与者进行 Peer-to-Peer 的同步。

数据库之间的同步是平时离线项目开发中最普遍的同步方式,因此微软在 Microsoft Sync Framework (MSF) 基础上开发了 Microsoft Sync Services for ADO.NET ,以方便数据库同步应用的开发。

Microsoft Sync Services for ADO.NET 安装后有三个 dll 用于同步应用开发:Microsoft.Synchronization.Data.dll ,Microsoft.Synchronization.Data.Server.dll ,Microsoft.Synchronization.Data.SqlServerCe.dll ,在 XP 系统下路径是:%Program Files%\Microsoft Synchronization Services\ADO.NET\v1.0 。

Synchronization Services API 提供了一组在数据服务和本地存储区之间同步数据的组件,而不仅仅是复制数据库及其架构。Microsoft Sync Services for ADO.NET 既可以用于简单的 2 层同步应用开发,也可用于 n 层同步应用和 peer-to-peer 同步应用。

本文通过一个简单的 2 层双向同步应用,着重介绍基本同步服务 API 的基本使用,尤其是 SqlSyncAdapterBuilder 。

本实例中客户端使用 sqlce 缓存数据,因此必须安装 sqlce 3.5,安装后的路径是 :%Program Files%\Microsoft SQL Server Compact Edition\v3.5\Desktop 。如果在运行时发生:“该数据库文件是使用早期版本的 sql server compact 创建的,。。。”,说明你引用了sqlce 3.1 或更低版本的 sqlce dll ,请确认安装了 sqlce 3.5 并且在项目中正确的引用。

对于两层同步,Microsoft.Synchronization.Data.dll ,Microsoft.Synchronization.Data.Server.dll ,Microsoft.Synchronization.Data.SqlServerCe.dll 及 sqlce 的 ado.net 提供程序 System.Data.SqlServerCe.dll 都应该部署在客户端。服务器端数据库使用 sql server 2005 ,客户端通过 ado.net 访问服务器数据库。

双向同步应用实例简介:

客户端运行时点击 synchronize 按钮自动生成客户端 sqlce 数据库,并从服务器下载数据。

Synchronization Service for ADO.NET 实例:简单双向同步应用

我们可以在后台直接修改服务器端数据,然后同步时选中 server Database 单选钮,可以从服务器下载数据同时显示同步进程信息。

Synchronization Service for ADO.NET 实例:简单双向同步应用

 

 

可以在客户端通过 make random insert 等对本地数据进行更改,然后进行同步,客户端数据会同步到服务器。以下是在客户端执行 random insert 后同步的 progress 信息。

Synchronization Service for ADO.NET 实例:简单双向同步应用

Microsoft Sync Services for ADO.NET 同步程序开发步骤

1. 为数据同步准备服务器数据库,以支持同步服务:

建表并修改架构以支持同步:

Synchronization Service for ADO.NET 实例:简单双向同步应用CREATE TABLE pub..orders(order_id int NOT NULL primary key, order_date datetime NULL)
Synchronization Service for ADO.NET 实例:简单双向同步应用
CREATE TABLE pub..order_details(order_id int NOT NULL primary key, order_details_id int NOT NULL, product nvarchar(100NULL, quantity int NULL
Synchronization Service for ADO.NET 实例:简单双向同步应用
Synchronization Service for ADO.NET 实例:简单双向同步应用
-- 1. Create update_originator_id column defaulted to 0 to indicate server change (用于标志谁做的修改)
Synchronization Service for ADO.NET 实例:简单双向同步应用
ALTER TABLE pub..orders add update_originator_id int null default 0
Synchronization Service for ADO.NET 实例:简单双向同步应用
ALTER TABLE pub..order_details add update_originator_id int null default 0
Synchronization Service for ADO.NET 实例:简单双向同步应用
Synchronization Service for ADO.NET 实例:简单双向同步应用
-- Add last update timestamp column (记录最后修改时间)
Synchronization Service for ADO.NET 实例:简单双向同步应用
ALTER TABLE pub..orders add update_timestamp timestamp
Synchronization Service for ADO.NET 实例:简单双向同步应用
ALTER TABLE pub..order_details add update_timestamp timestamp
Synchronization Service for ADO.NET 实例:简单双向同步应用
Synchronization Service for ADO.NET 实例:简单双向同步应用
-- Add create timestamp column (用于标志创建时间)
Synchronization Service for ADO.NET 实例:简单双向同步应用
ALTER TABLE pub..orders add create_timestamp bigint default @@DBTS+1
Synchronization Service for ADO.NET 实例:简单双向同步应用
ALTER TABLE pub..order_details add create_timestamp bigint default @@DBTS+1
Synchronization Service for ADO.NET 实例:简单双向同步应用
Synchronization Service for ADO.NET 实例:简单双向同步应用
Synchronization Service for ADO.NET 实例:简单双向同步应用
--
Synchronization Service for ADO.NET 实例:简单双向同步应用--
  创建墓碑表,用于记录删除数据
Synchronization Service for ADO.NET 实例:简单双向同步应用--
Synchronization Service for ADO.NET 实例:简单双向同步应用
CREATE TABLE pub..orders_tombstone(order_id int NOT NULL primary key, order_date datetime NULL, update_originator_id int default 0,  update_timestamp timestamp, create_timestamp bigint)
Synchronization Service for ADO.NET 实例:简单双向同步应用
CREATE TABLE pub..order_details_tombstone(order_id int NOT NULL primary key, order_details_id int NOT NULL, product nvarchar(100NULL, quantity int NULL, update_originator_id int default 0,  update_timestamp timestamp, create_timestamp bigint)
Synchronization Service for ADO.NET 实例:简单双向同步应用
Synchronization Service for ADO.NET 实例:简单双向同步应用
Synchronization Service for ADO.NET 实例:简单双向同步应用
--
Synchronization Service for ADO.NET 实例:简单双向同步应用--
  创建触发器,在对服务器表有更改时记录这些更改,以支持同步。
Synchronization Service for ADO.NET 实例:简单双向同步应用--
 
Synchronization Service for ADO.NET 实例:简单双向同步应用--
 update triggers
Synchronization Service for ADO.NET 实例:简单双向同步应用
use pub
Synchronization Service for ADO.NET 实例:简单双向同步应用
go
Synchronization Service for ADO.NET 实例:简单双向同步应用
CREATE TRIGGER orders_update_trigger on orders for update
Synchronization Service for ADO.NET 实例:简单双向同步应用
as
Synchronization Service for ADO.NET 实例:简单双向同步应用    
update o
Synchronization Service for ADO.NET 实例:简单双向同步应用    
set o.update_originator_id = 0        
Synchronization Service for ADO.NET 实例:简单双向同步应用    
from [orders] o join [inserted] i on o.order_id = i.order_id
Synchronization Service for ADO.NET 实例:简单双向同步应用    
where not UPDATE(update_originator_id)
Synchronization Service for ADO.NET 实例:简单双向同步应用
go 
Synchronization Service for ADO.NET 实例:简单双向同步应用
Synchronization Service for ADO.NET 实例:简单双向同步应用
CREATE TRIGGER order_details_update_trigger on order_details for update
Synchronization Service for ADO.NET 实例:简单双向同步应用
as
Synchronization Service for ADO.NET 实例:简单双向同步应用    
update o
Synchronization Service for ADO.NET 实例:简单双向同步应用    
set o.update_originator_id = 0        
Synchronization Service for ADO.NET 实例:简单双向同步应用    
from [order_details] o join [inserted] i on o.order_id = i.order_id
Synchronization Service for ADO.NET 实例:简单双向同步应用    
where not UPDATE(update_originator_id)
Synchronization Service for ADO.NET 实例:简单双向同步应用
go 
Synchronization Service for ADO.NET 实例:简单双向同步应用
Synchronization Service for ADO.NET 实例:简单双向同步应用
-- delete triggers
Synchronization Service for ADO.NET 实例:简单双向同步应用
use pub
Synchronization Service for ADO.NET 实例:简单双向同步应用
go
Synchronization Service for ADO.NET 实例:简单双向同步应用
CREATE TRIGGER orders_delete_trigger on orders for delete
Synchronization Service for ADO.NET 实例:简单双向同步应用
as
Synchronization Service for ADO.NET 实例:简单双向同步应用    
insert into pub..orders_tombstone (order_id, order_date, create_timestamp, update_originator_id) select order_id, order_date, create_timestamp, 0 from deleted
Synchronization Service for ADO.NET 实例:简单双向同步应用
go    
Synchronization Service for ADO.NET 实例:简单双向同步应用
Synchronization Service for ADO.NET 实例:简单双向同步应用
CREATE TRIGGER order_details_delete_trigger on order_details for delete
Synchronization Service for ADO.NET 实例:简单双向同步应用
as
Synchronization Service for ADO.NET 实例:简单双向同步应用    
insert into pub..order_details_tombstone (order_id, order_details_id, product, quantity, create_timestamp, update_originator_id) select order_id, order_details_id, product, quantity, create_timestamp, 0 from deleted
Synchronization Service for ADO.NET 实例:简单双向同步应用
go    
Synchronization Service for ADO.NET 实例:简单双向同步应用
Synchronization Service for ADO.NET 实例:简单双向同步应用


2. 扩展 Microsoft Sync Services for ADO.NET 进行同步

创建 SyncAgent ,可以直接创建 SyncAgent ,也可以通过继承实现新的 SyncAgent 。我们直接在同步前创建:  
SyncAgent syncAgent = new SyncAgent();  

为 SyncAgent 指定 Source Provider 和 Destination Provider ,在 sync service for ado.net 中,分别是 DbServerSyncProvider (或其子类)和 SqlCeClientSyncProvider 。

Synchronization Service for ADO.NET 实例:简单双向同步应用DbServerSyncProvider serverSyncProvider = new DbServerSyncProvider();
Synchronization Service for ADO.NET 实例:简单双向同步应用syncAgent.RemoteProvider 
= serverSyncProvider; 
Synchronization Service for ADO.NET 实例:简单双向同步应用
Synchronization Service for ADO.NET 实例:简单双向同步应用SqlCeClientSyncProvider clientSyncProvider 
= new SqlCeClientSyncProvider(connString);
Synchronization Service for ADO.NET 实例:简单双向同步应用syncAgent.LocalProvider 
= clientSyncProvider; 
Synchronization Service for ADO.NET 实例:简单双向同步应用

 

构建 SyncAdapter 并指定给 ServerSyncProvider:构建 SyncAdapter 是开发量最大的地方,我们要指定很多 DbCommand 。微软为 sql server 数据库创建了 SqlSyncAdapterBuilder 以简化 SyncAdapter 的构造。
 

Synchronization Service for ADO.NET 实例:简单双向同步应用               SqlSyncAdapterBuilder orderDetailsBuilder = new SqlSyncAdapterBuilder();
Synchronization Service for ADO.NET 实例:简单双向同步应用                orderDetailsBuilder.SyncDirection 
= SyncDirection.Bidirectional; //指明同步方向,这里是双向
Synchronization Service for ADO.NET 实例:简单双向同步应用                orderDetailsBuilder.Connection 
= serverConnection; //指明要连接的服务器数据库 
Synchronization Service for ADO.NET 实例:简单双向同步应用
Synchronization Service for ADO.NET 实例:简单双向同步应用                
// 指定要同步的表和表的字段
Synchronization Service for ADO.NET 实例:简单双向同步应用                orderDetailsBuilder.TableName 
= "order_details";
Synchronization Service for ADO.NET 实例:简单双向同步应用                orderDetailsBuilder.DataColumns.
Add("order_id");
Synchronization Service for ADO.NET 实例:简单双向同步应用                orderDetailsBuilder.DataColumns.
Add("order_details_id");
Synchronization Service for ADO.NET 实例:简单双向同步应用                orderDetailsBuilder.DataColumns.
Add("product");
Synchronization Service for ADO.NET 实例:简单双向同步应用                orderDetailsBuilder.DataColumns.
Add("quantity"); 
Synchronization Service for ADO.NET 实例:简单双向同步应用
Synchronization Service for ADO.NET 实例:简单双向同步应用                
// 指定 tombstone 表,用于跟踪删除
Synchronization Service for ADO.NET 实例:简单双向同步应用                orderDetailsBuilder.TombstoneTableName 
= "order_details_tombstone";
Synchronization Service for ADO.NET 实例:简单双向同步应用                orderDetailsBuilder.TombstoneDataColumns.
Add("order_id");
Synchronization Service for ADO.NET 实例:简单双向同步应用                orderDetailsBuilder.TombstoneDataColumns.
Add("order_details_id");
Synchronization Service for ADO.NET 实例:简单双向同步应用                orderDetailsBuilder.TombstoneDataColumns.
Add("product");
Synchronization Service for ADO.NET 实例:简单双向同步应用                orderDetailsBuilder.TombstoneDataColumns.
Add("quantity");
Synchronization Service for ADO.NET 实例:简单双向同步应用                
// 指明根据哪些列进行跟踪
Synchronization Service for ADO.NET 实例:简单双向同步应用                orderDetailsBuilder.CreationTrackingColumn 
= @"create_timestamp";
Synchronization Service for ADO.NET 实例:简单双向同步应用                orderDetailsBuilder.UpdateTrackingColumn 
= @"update_timestamp";
Synchronization Service for ADO.NET 实例:简单双向同步应用                orderDetailsBuilder.DeletionTrackingColumn 
= @"update_timestamp";
Synchronization Service for ADO.NET 实例:简单双向同步应用                orderDetailsBuilder.UpdateOriginatorIdColumn 
= @"update_originator_id"; 
Synchronization Service for ADO.NET 实例:简单双向同步应用
Synchronization Service for ADO.NET 实例:简单双向同步应用        
//调用 ToSyncAdapter() 生成 SyncAdapter 
Synchronization Service for ADO.NET 实例:简单双向同步应用                SyncAdapter orderDetailsSyncAdapter 
= orderDetailsBuilder.ToSyncAdapter(); 
Synchronization Service for ADO.NET 实例:简单双向同步应用
Synchronization Service for ADO.NET 实例:简单双向同步应用        
//把 SyncAdapter 指定给 serverSyncProvider
Synchronization Service for ADO.NET 实例:简单双向同步应用        serverSyncProvider.SyncAdapters.
Add(orderDetailsSyncAdapter); 
Synchronization Service for ADO.NET 实例:简单双向同步应用
Synchronization Service for ADO.NET 实例:简单双向同步应用

以上只是核心开发步骤简介,还有很多细节没有介绍,大家可以下载相关实例仔细研究。

https://files.cnblogs.com/flyabroad/SyncAdoDemo.7z

更多实例请去 : http://www.syncguru.com/Projects.aspxhttp://code.msdn.microsoft.com/sync 下载
FLYabroad
标签: MSF

相关文章:

  • 2022-12-23
  • 2021-12-22
  • 2022-12-23
  • 2021-06-22
  • 2021-05-21
  • 2022-12-23
  • 2021-12-26
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-05-12
  • 2021-05-19
  • 2022-12-23
  • 2021-12-04
相关资源
相似解决方案