Microsoft Sync Frameworks簡稱MSF,是一個綜合的同步平台,MSF支持應用程序,服務,設備的在線以及離線同步。MSF主要有以下幾個部件組成:
* Sync Services for ADO.NET: 同步ADO.NET的數據
* Sync Services for FeedSync: 同步 RSS 和 ATOM 種子
* Sync Services for File Systems: 同步文件和文件夾
* Sync Framework Core Runtime: 客戶化的同步方案,支持native code。
本文主要講述如何快速建立一個Sync Services for ADO.NET的應用進行數據同步。由於在PC的winform項目可以在使用向導快速建立同步程序,所以本文先介紹PC的webform程序上的Sync Services for ADO.NET開發,陸續會介紹移動設備上的開發,這也是我最關心的部分。
下載安裝
請到以下鏈接下載 Microsoft Synchronization Services for ADO.NET。 Microsoft Synchronization Services for ADO.NET本地緩存數據需要使用SQL CE 3.5,不能支持SQL CE 3.0。SQL CE 3.5和3.0的差異可以參考 .NET Campact Framework下SQL CE兼容性問題
建立Local Database Cache
先建立一個PC的winform程序。右鍵項目新建“New Item”,經過了Microsoft Synchronization Services for ADO.NET 的安裝,新建向導會出現“Local Database Cache”,選擇該類型。
圖1
這個文件可以建立服務器與本地數據庫的同步關系,服務器數據庫可以為支持ADO.NET的任何數據庫,我使用免費的SQL Server Express,本地數據庫是SQL CE 3.5,可以不用手工建立,向導程序根據服務器數據自動生成本地數據庫。SQL Server Express的下載安裝可以參考 SQL Server Express和SQL Server Compact的應用
在SQL Server Express上建立一個庫叫做TestDB,建立兩個表,表結構如下:
CREATE TABLE [dbo].[t1](
[f1] [int] NOT NULL,
[f2] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
CONSTRAINT [PK_t1] PRIMARY KEY CLUSTERED
(
[f1] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
CREATE TABLE [dbo].[t2](
[f1] [int] NOT NULL,
[f2] [datetime] NOT NULL,
CONSTRAINT [PK_t2] PRIMARY KEY CLUSTERED
(
[f1] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
選擇數據庫
圖2
配置完數據庫服務器後,可以選擇“Add”增加需要同步的表,在例子中選擇t1和t2。
圖3
如果數據表屬於下面的情況,那麼就不能顯示出來進行選擇:
1.不是用戶默認的原數據(user’s default schema)。
2.沒有定義主鍵。
3.名字長於118個字符。
4.字段中有SQL CE 3.5不支持的數據類型。
在默認選擇下向導會為原始表自動增加LastEditDate和CreationDate自動。同時增加數據表 (原表名_TombStone)。
添加數據源(DataSet)
在增加同步數據表完畢後,向導自動彈出增加數據源(DataSet)的向導,填寫DataSet的名字,選擇所以表格和字段。
圖4
系統會自動的生成處理類和數據類,如下圖
圖5
在程序中增加Load事件處理函數和增加一個按鈕以及處理函數,添加代碼如下:
public partial class Form1 : Form
{
TestDbDataSet testDbDataSet = new TestDbDataSet();
TestDbDataSetTableAdapters.t1TableAdapter t1TableAdapter = new TestDbDataSetTableAdapters.t1TableAdapter();
TestDbDataSetTableAdapters.TableAdapterManager tableAdapterManager = new TestDbDataSetTableAdapters.TableAdapterManager();
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
tableAdapterManager.UpdateAll(testDbDataSet);
//Call SyncAgent.Synchronize() to initiate the synchronization process.
//Synchronization only updates the local database, not your project's data source.
LocalDataCache1SyncAgent syncAgent = new LocalDataCache1SyncAgent();
Microsoft.Synchronization.Data.SyncStatistics syncStats = syncAgent.Synchronize();
testDbDataSet.t1.Merge(t1TableAdapter.GetData());
}
private void Form1_Load(object sender, EventArgs e)
{
t1TableAdapter.Fill(testDbDataSet.t1);
}
}
一個從server同步到本地SQL CE的程序完成了。
TestDbDataSet: 表示一個強類型的內存數據緩存。
t1TableAdapter 表示用於取數據庫和保存數據的connection和commands。
TableAdapterManager 用於協助TableAdapters之間關聯關系的更新(Hierarchical Update)。
測試
在SQL Server Express裡的t1表格增加些數據,如下
圖6
運行程序,點擊同步按鈕進行同步。
在VS2008打開SQL CE數據庫,你會發現SQL CE庫的數據和SQL Server Express裡的t1表格一模一樣。
修改,刪除SQL Server Express裡的t1表格的數據,進行再測試,也會發現SQL CE庫不同在服務器上的數據。