微软同步框架入门开篇(附SnapShot快照Demo)
???? 在Teched2008上聽了一節關于MSF(Microsoft Sync Framework 微軟同步框架),這一框架允許
開發者創建離線式的應用、設備和服務,可以與任何應用的任意類型數據進行集成。
???? 有關這個模架的介紹在網上有一些鏈接,而園子里也有朋友做過這方面的介紹。當時東西好不好,只有
用過才會知道。今天這篇文章就是簡單試用一把MSF來開發ADO.NET同步的DEMO(當然其也支持文件和文
件夾的同步,我會在以后寫文介紹研究心得)。因為是初次使用,所以截圖多了一些,當然在概念理解上也
可能有偏差,有這方面開發經驗的朋友歡迎指正。
???? 好了,開始正文吧。
???? 在開發本應用之前,假設您已下載并安裝了相應的MSF框架服務包和SDK,如果沒安裝的朋友請自行
下載并安裝,下載鏈接。
???? 本人下載安裝的是:SyncSetup_zh-CHS.x86.zip
?? (因為本文的VS是中文的,所以就使用了Microsoft Sync Framework v1.0 - 簡體中文)
???? 當然,目前該框架的最新版本是Sync Framework v2 CTP1(目前暫無中文開發包,且不支持在1.0
和2.0版本之間的組件協同操作Interoperability)。
???
???? 首先,我們需要了解一下該框架實現ADO.NET同步的實現原理。請看下圖:
???
?
????? 我們可以看到在客戶端數據庫(SqlServerCompact3.5)與服務端數據(Server Database)之間是
提供了一組(兩個)Provider,分別是ClientSyncProvider和ServerSyncProvider, 其中:?????
?????提取(供)與客戶端數據存儲區(SqlServerCompact3.5)進行通信并將同步代理(SyncAgent)
與該數據存儲區的特定實現隔離的客戶端同步提供程序。說明白了就是該對象用于與本地數據存儲區
進行通信。
?????ServerSyncProvider用于:
?????提取(供)與服務器數據存儲區(Server?Database)進行通信并將同步代理與該數據存儲區的
特定實現隔離的一般服務器同步提供程序。該對象用于與遠程數據存儲區進行通信。
?????這兩個對象會通過下面的SyncAgent類以屬性方式來提供:)????
???? 而圖中的SyncAgent用于對象組織同步過程。其中的:????
????Synchronize()?方法會在本地和遠程數據存儲之間同步數據(下面會用到)。?????LocalProvider?屬性:??獲取或設置一個派生自?ClientSyncProvider?的對象。?
?????RemoteProvider?屬性:?獲取或設置一個派生自?ServerSyncProvider?的對象。
?
???? 圖中的SyncTable對象表示在同步過程中涉及的表的客戶端設置。比如我們可以通過SyncDirection
屬性來設置該值表示相對于客戶端的同步方向,其類型為枚舉,包括如下幾個值:????
???????????????????客戶端將更改上載到服務器,然后從服務器下載更改。?
?????DownloadOnly:?首次同步期間,客戶端通常從服務器下載架構和一個初始數據集。執行后續同步時,
???????????????????客戶端從服務器下載更改。?
?????Snapshot:??客戶端將從服務器下載一個數據集。每次同步期間,這些數據都將完全刷新(本文演示)?
????UploadOnly:???首次同步期間,客戶端通常從服務器下載架構。執行后續同步時,客戶端將更改上
???????????????????載到服務器。?
??? ?圖中的SyncAdapter用于提供一組數據命令,這些命令用于獲取架構信息以及在服務器數據庫中檢索
和應用更改(通過SQL語句或存儲過程)。
??? 當然上圖中的結構有些復雜,涉及到的類多了一些。但我們不用手工來寫這些代碼。只要按照操作
導航一步步走下來,就會生成這個類了。下面就以一個快照方式(Snapshot)來開發一個DEMO來大概了
解一下相應的操作流程。
???? 首先,我們需要新建一個"Windows窗體應用程序", 項目名稱隨個人喜好。
???? 然后在生成的解決方案瀏覽器中右擊“添加”-->“新建項”,打開新建項窗口,然后找到“本
地數據庫緩存”圖標項,設置如下:
?????
?????????
???? 然后單擊“添加”,進入“配置數據同步”對話框,在該對象框中我們將完成遠程數據庫與本地
數據庫(如沒有則要新建)的相關信息綁寫。首先要設置“服務器鏈接”(這塊類型于SQLSERVER鏈接
登陸,這里就不多說了)。然后是設置客戶端鏈接,如下圖:
???????
???? 在新建并設置密碼(可選項,本DEMO中未設置密碼)之后單擊“確定”,這時在“配置數據同步”
窗口中就會顯示我們新建的本地SQLCE數據庫文件,然后按下圖進行相應設置:
??????
???? 然后單擊“添加”按鈕,在“配置供脫機使用的表”窗口中設置相應的表格,本DEMO中因為只同步
主題表(dnt_topics),所以只選中了該表,然后在“要下載的數據”下拉框中選擇“每次更新整個表”
(此處設置對應前面所說的SnapShot快照方式,當然我們可在項目生成之后在代碼中手工修改)。下圖:
????
???? 然后我們單擊“確定”按鈕。這樣我們就把剛添加的表添加到了當前設置中,然后在“配置數據同步”
窗口中單擊“確定”按鈕之后,進入“數據源配置”向導,在這個窗口中來對主題表進行更細致的設置,如
下圖所示:
???????
???? 然后單擊“完成”按鈕,即完成了向導的設置和代碼生成工作。在初始化完成之后,我們需要定義
一個WINFORM來顯示我們同步的數據,其界面截圖如下:
???????
????? 圖中我們在數據窗口中放置了一個DataGridView控件,然后該控件上右擊“屬性”,然后在該控件
“屬性列表”中的DataSource進行如下圖設置:
???????
??? 通過該項設置,設計器會為我們生成下面這一行代碼:????
this.dnt_topicsTableAdapter.Fill(this.localDataSet_Topic.dnt_topics);????
???? 其中的dnt_topicsTableAdapter即是本地數據(SQLCE)的數據適配器,通過它即完成了向指寫數據集
(LocalDataSet_Topic)中的數據表(dnt_topics,這里為dnt_topicsDataTable類型,其父類為Typed-
TableBase)的數據填充。
???? 當然上面所說明的“dnt_topicsTableAdapter”“localDataSet_Topic”“dnt_topics”均是由設計器生
成的,正如前面分析模型圖時所說的那樣,設計器基本上生成了圖中的所說的所有類(分布于下載源碼項目
中的LocalDataSet_Topic.Designer.cs和SyncSnapData.Designer.cs兩個文件中)。前面所說的
SnapShot(快照方式)的設置也在SyncSnapData.Designer.cs文件中進行設置,如下:
????????????
???????
??????[System.Diagnostics.DebuggerNonUserCodeAttribute()]
??????private?void?InitializeTableOptions()?{
??????????this.TableName?=?"dnt_topics";
??????????//此處可以修改成其它三種方式:Bidirectional,DownloadOnly,UploadOnly
??????????//當然在數據邏輯上也要有相應修改變
??????????this.SyncDirection?=?Microsoft.Synchronization.Data.SyncDirection.Snapshot;
??????????this.CreationOption?=?Microsoft.Synchronization.Data.TableCreationOption.
?????????????????DropExistingOrCreateNewTable;
??????}
}
?
??? 下面的方法用于將數據填充到相應的數據集中將完成向DataGridView控件的綁寫:
?
????????private?void?LoadData()????????{
????????????this.dnt_topicsTableAdapter.Fill(this.localDataSet_Topic.dnt_topics);
????????????SnapDatasView.AutoGenerateColumns?=?true;
????????????SnapDatasView.DataSource?=?this.localDataSet_Topic.dnt_topics;
????????????this.dnt_topicsTableAdapter.Dispose();
????????}
?
???? 當然,上面只是獲取數據的一種方式,我們也可以通過下面的直接方式來連接本地SQLCE數據
庫來執行相應的SQL語句,如下:
?
?????SyncSnapDataClientSyncProvider?clientSynProvider?=?new?SyncSnapDataClientSyncProvider();??????SqlCeConnection?scc?=?new?SqlCeConnection(clientSynProvider.ConnectionString);
??????SqlCeDataAdapter?scda?=?new?SqlCeDataAdapter("SELECT?*?FROM?[dnt_topics]?ORDER?BY?[tid]?ASC",?scc);
??????DataSet?ds?=?new?DataSet();
??????scda.Fill(ds);
??????SnapDatasView.AutoGenerateColumns?=?true;
??????SnapDatasView.DataSource?=?ds.Tables[0];
??????scda.Dispose();
??????scc.Close();
?
??? 有了這些方法之后,我們還要寫一下同步數據的代碼,下面的兩行代碼即完成了將遠程SQLSERVER服務器
上的數據同步到本地SQLCE數據庫的任務:????
????//?調用?SyncAgent.Synchronize()?以啟動同步過程,同步僅更新本地數據庫。??
?????Microsoft.Synchronization.Data.SyncStatistics?syncStats?=?syncAgent.Synchronize();
?
???? 其中的SyncStatistics用于獲得此次同步的一些統計數據信息,如:????
?????DownloadChangesFailed:從服務器下載的無法在客戶端應用的更改數?????TotalChangesDownloaded:從服務器下載的更改總數[其中包括無法在客戶端應用的更改]
?????TotalChangesUploaded:從客戶端上載的更改總數[其中包括無法在服務器上應用的更改]
?????DownloadChangesFailed:從服務器下載的無法在客戶端應用的更改數
?????
?
???? 好了,開發代碼基本完成了,下面運行一下程序(F5):
???? 我們單擊“加載本地數據”按鈕(之前需要首次同步數據),如下圖:
??? ????
???? 數據顯示當前tid=601的數據行,其fid為190.
???? 這里我們用SQL企業管理器打開遠程數據服務器,將相應的tid數據行的fid字段修改為“290(新值)”。
這里,我們在當前DEMO程序中再次單擊“加載本地數據”按鈕按鈕時,數據依舊是“190(舊值)”,原因
在于本地的數據庫還用的是舊數據,而不是遠程的新數據。所以我們需要同步一下,點擊“同步到本地”按鈕
后,我們就會看到新的數據已被下載到本地顯示了。如下圖:
????? ???
???? 好了,今天的DEMO就先到這里了,當然還有一些內容沒說,比如設計器所生成的代碼和數據同步的另外三
種方式,以及文件同步等內容我會在后續章節中加以說明。
???? 原文鏈接:http://www.cnblogs.com/daizhj/archive/2008/11/13/1332594.html
???? 作者: daizhj, 代震軍
???? Tags: 微軟同步框架,ado.net,sqlce
???? 網址: http://daizhj.cnblogs.com/
???? 源碼下載,請點擊這里.???
????
????
?
????
????
???
轉載于:https://www.cnblogs.com/daizhj/archive/2008/11/13/1332594.html
總結
以上是生活随笔為你收集整理的微软同步框架入门开篇(附SnapShot快照Demo)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于MSSQL数据存储的问题
- 下一篇: 控制項學習三(從繼承開始)