近年來,移動設(shè)備的爆炸性增長促使消費者和企業(yè)對新型移動應(yīng)用程序的需求不斷提高。在這種背景下,Microsoft 創(chuàng)建了許多工具和框架,以便使軟件開發(fā)人員可以充分利用這些智能設(shè)備的功能。將這些工具集和廣泛的設(shè)備選項組合起來可以創(chuàng)建最先進(jìn)的移動應(yīng)用程序。
Microsoft® SQL 2000 Windows® CE Edition(又稱作 SQL Server™ CE 2.0)甚至將 Microsoft SQL Server 的更多功能擴展到了基于 Windows CE 的設(shè)備上。SQL Server CE 2.0 為在 Windows CE 或 Windows CE .NET 操作系統(tǒng)上構(gòu)建可靠的數(shù)據(jù)庫應(yīng)用程序提供了所有關(guān)鍵功能(例如,數(shù)據(jù)存儲、優(yōu)化查詢處理器、多個連接選項等等)。這個新版本還提供了與 SQL Server 2000 的橫向兼容性。令人難以置信的是,它提供了該功能的全部內(nèi)容,但是卻能夠保持極小的內(nèi)存足跡。
該版本提供了重要的新功能以及對其前身的性能改進(jìn)。如果您以前用過 SQL Server CE,將會注意到新版本對性能作了改進(jìn),并且將編程模型擴展為支持 .NET Compact Framework。
在本文中,我們將關(guān)注新版 SQL Server CE 的一些關(guān)鍵的新功能,并考察突出這些功能的代碼。請記住,本文并不打算介紹 SQL Server CE 產(chǎn)品的所有方面。無論您是經(jīng)驗豐富的移動開發(fā)人員,還是剛?cè)腴T的新手,它都將激起您使用新版 SQL Server CE 創(chuàng)建移動應(yīng)用程序的欲望。
開發(fā)移動解決方案
如果您是創(chuàng)建移動應(yīng)用程序的新手,您會發(fā)現(xiàn)包含基于 Windows 的移動設(shè)備、開發(fā)工具和框架的列表是令人畏懼的。SQL Server CE 2.0 只是移動開發(fā)人員“彈藥庫”中的一個“武器”。要推薦一種完美的工具和設(shè)備組合來創(chuàng)建特定的移動解決方案是不可能的。不管怎樣,有一些變數(shù)需要考慮。
當(dāng)今的開發(fā)人員可以面向一系列基于 Windows CE 的設(shè)備。Pocket PC (PPC) 和 Handheld PC (HPC) 的面世已經(jīng)有一段時間了。其中許多設(shè)備都裝備了無線 LAN 模塊(例如,藍(lán)牙和 802.11b),從而使它們成為功能極為強大的設(shè)備,可以隨時進(jìn)行網(wǎng)絡(luò)連接。基于 3.x 操作系統(tǒng)的設(shè)備傾向于面向消費者,但是很多公司意識到,這些設(shè)備既能用于其消費者又能用于其員工。
最近,制造商開始在設(shè)備自身中嵌入無線訪問模塊。過去,為了容納無線 LAN 卡,需要在設(shè)備上配備體積巨大的 PC卡。蜂窩電話也趨于向 Pocket PC 集成,這將是一個有趣的技術(shù)組合。
配備有 Windows CE 的嵌入式設(shè)備已經(jīng)滲入到我們的工作場所當(dāng)中了。而且,為了擴展其接受程度,許多設(shè)備從物理上進(jìn)行了強化,這樣從幾英尺高處掉下不至于損壞。
一個有趣的現(xiàn)象是,其中的許多嵌入式 OEM 設(shè)備的 Windows CE 操作系統(tǒng)版本甚至比面向消費者的設(shè)備上的那些可用 Windows CE 操作系統(tǒng)版本更新。最新的 OEM 設(shè)備運行 4.x 版的 Windows CE。在默認(rèn)情況下,這些設(shè)備包括 .NET Compact Framework。這使得該平臺對于想利用 Microsoft 提供的下一代工具和框架的企業(yè)開發(fā)人員來說,非常有吸引力。
Windows CE 也加進(jìn)了各種各樣有趣的硬件技術(shù),包括 Compact Flash (CF) 讀取器、條形碼掃描器、磁條讀取器、全球定位系統(tǒng) (GPS)、指紋識別和照相機等。圖 1 闡釋了當(dāng)今一些公司正在利用基于 Windows CE 的設(shè)備和工具開發(fā)的一些典型的移動解決方案。顯而易見,這些移動應(yīng)用程序需要一個緊湊且可靠的本地存儲解決方案。
移動應(yīng)用程序開發(fā)人員的最大挑戰(zhàn)是,移動設(shè)備上的可用內(nèi)存量相對較小(一般為 16MB-32MB)。移動設(shè)備的內(nèi)存容量增加的越多,移動應(yīng)用程序也就越復(fù)雜。當(dāng)然,本地存儲機制必須具備一個小內(nèi)存足跡。撇去內(nèi)存注意事項不談,應(yīng)用程序很可能還要針對本地存儲執(zhí)行復(fù)雜的查詢。
此外,這些應(yīng)用程序在聯(lián)機狀態(tài)和脫機狀態(tài)時都必須工作得一樣好。這就有必要具備本地和遠(yuǎn)程數(shù)據(jù)訪問 API,以及與后端數(shù)據(jù)庫間的某種形式的同步。幸運的是,SQL Server CE 2.0 提供了一個用于生成滿足這些要求的應(yīng)用程序的框架。
處于脫機模式時,SQL Server CE 在本地設(shè)備上提供存儲。數(shù)據(jù)庫更改可以在設(shè)備上被可靠地跟蹤,當(dāng)重新建立連接時,這些更改就可以和后端數(shù)據(jù)庫進(jìn)行同步。服務(wù)器端更改也是如此。SQL Server CE 支持名為“合并復(fù)制”的功能,在將該功能與 SQL Server 2000 協(xié)同使用時,可以對所有數(shù)據(jù)庫更改提供雙向同步。
移動開發(fā)工具
移動應(yīng)用程序開發(fā)人員既可以選擇使用現(xiàn)有的工具進(jìn)行開發(fā),也可以用 SQL Server CE 2.0 的下一代工具進(jìn)行開發(fā)。
對于喜歡使用 eMbedded Visual Tools 3.0 開發(fā)移動應(yīng)用程序的人來說,這些舊式工具繼續(xù)受 SQL Server CE 2.0 支持。可以繼續(xù)用 eMbedded Visual Basic® 和 eMbedded Visual C++® 編寫應(yīng)用程序。如果您選擇使用 eMbedded Visual Tools,請注意,SQL Server CE 2.0 要求在設(shè)備上安裝 3.x 版或更高版本的 Windows CE 操作系統(tǒng)。
使用 Microsoft 的下一代工具和框架,快速開發(fā)移動應(yīng)用程序?qū)⒊蔀榭赡堋kS著應(yīng)用程序開發(fā)轉(zhuǎn)向 Windows .NET 平臺,移動應(yīng)用程序?qū)⒖梢岳卯?dāng)今桌面平臺具有的許多創(chuàng)新。用 eMbedded Visual Basic 或 Visual C++ 編寫的應(yīng)用程序?qū)⒖梢陨壍?Visual Basic .NET、C# 和 ADO.NET。
Microsoft 已經(jīng)向世人展示了其智能設(shè)備擴展 (SDE),它可以讓移動開發(fā)人員利用基于 Visual Studio®.NET. 的統(tǒng)一工具集。Visual Studio .NET 與 SDE 的結(jié)合會為創(chuàng)建基于 Windows CE 的應(yīng)用程序提供一個無縫集成的開發(fā)平臺。
Visual Studio .NET 的下一版本(代號為“Everett”)將為 .NET Compact Framework, Pocket PC 200x 和 Windows CE .NET 4x 設(shè)備提供本機支持。
SQL Server CE 2.0 語言功能
SQL Server CE 2.0 包括其自身的本機 OLE DB 提供程序。與 SQL Server 2000 OLE DB 提供程序(公開許多屬性來指定服務(wù)器和數(shù)據(jù)庫)不同的是,SQL Server CE 僅使用單個屬性 — DBPROP_INIT_DATASOURCE,用該屬性打開數(shù)據(jù)庫文件時使用的是完整路徑。例如,要打開數(shù)據(jù)庫文件 \Windows\Northwind.sdf,在調(diào)用 IDBProperties::SetProperties 時,要在 DBPROP_INIT_DATASOURCE 屬性中傳遞字符串 \Windows\Northwind.sdf。
SQL Server CE 還支持文件級的訪問控制機制 — 其名稱為數(shù)據(jù)庫密碼。每次打開數(shù)據(jù)庫時必須傳遞這個密碼。在提供程序特定的屬性集 DBPROPSET_SSCE_DBINIT 中,屬性 DBPROP_SSCE_DBPASSWORD 應(yīng)當(dāng)用于指定該值。在新建數(shù)據(jù)庫時,該屬性可用來指定必須使用的密碼。
SQL Server 2000 中逐漸為人所了解和喜愛的內(nèi)部函數(shù)現(xiàn)在也得到支持。現(xiàn)在您可以在查詢中使用數(shù)學(xué)函數(shù)、字符串函數(shù)和系統(tǒng)函數(shù)來執(zhí)行運算并返回標(biāo)量值。而在以前,您需要使用 eMbedded Visual Basic(或 eMbedded Visual C++)函數(shù)來完成此操作。與 SQL Server CE 1.0 相比,使用內(nèi)部函數(shù)可以大大提高性能。
例如,為了讓 ListBox 中的結(jié)果更易于格式化,圖 2 演示了如何將某一列轉(zhuǎn)換為 char(50) 列。在 SQL Server CE 中,對 SELECT 語句使用 UNION 會將兩個或更多個查詢的結(jié)果組合到單個結(jié)果集中,該結(jié)果集由屬于該聯(lián)合中全部查詢的所有行組成。下面的代碼片段演示了如何在 SELECT 語句中使用這個新的 UNION 子句:
Dim strSQL As String = "SELECT * FROM TableA UNION SELECT * FROM TableB"
SQL Server CE 2.0 通過 ADO.NET 增加了對參數(shù)化查詢的支持。該功能對于使用 eMbedded Visual Tools 4.x(使用 OLEDBCE 提供程序)的開發(fā)人員也是可用的。那些熟悉 SQL Server 2000 中參數(shù)化查詢的人會注意到一些差別。由于 SQL Server CE 沒有內(nèi)置的查詢存儲機制,因此參數(shù)實際上是在運行時提供的值的占位符(“?”)。SQL Server 2000 和 SQL Server CE 間的另一個明顯的區(qū)別是,前者不支持命名參數(shù)。正像下面的代碼所示,對參數(shù)化查詢的支持是 SQL Server CE 2.0 的新功能。
Dim strSQL As String = "INSERT INTO TableA (col1, col2) VALUES (?, ?)";
索引拉出是另一個新功能。應(yīng)用程序調(diào)用 Pull 方法,以便從 SQL Server 數(shù)據(jù)庫提取數(shù)據(jù),并將其存儲在 SQL Server CE 中的數(shù)據(jù)庫表中。最初的 SQL Server CE 版本只支持表的主鍵。SQL Server CE 2.0 則支持主鍵和所有其他索引。
在應(yīng)用程序中使用 Pull 方法,可通過設(shè)置適當(dāng)?shù)母欉x項來跟蹤對 SQL Server CE 表作出的更改。SQL Server CE 跟蹤所有的插入、更新和刪除操作(請參閱 圖 3)。
與先前版本的 SQL Server CE 相比,新版本的另一個改進(jìn)是加入了更加可靠的錯誤處理功能。正如您可能在前面代碼片段中所注意到的那樣,在 .NET Compact Framework 中用 Visual Basic .NET 和 C# 編寫的應(yīng)用程序可以使用內(nèi)置的 try/catch 支持。如果您用 Visual Studio .NET 編寫過任何桌面應(yīng)用程序,可能就非常熟悉這種方式的異常處理。那些在 eMbedded Visual Basic 中被限制以 On Error GoTo 方式處理異常的開發(fā)人員肯定會欣賞這個新的語言功能。為了完善 try/catch 構(gòu)造,SQL Server CE 增加了一個名為 SqlCeException 的新類,這個類允許您捕捉本機 SQL Server CE 錯誤并適當(dāng)?shù)靥幚硭鼈儭?/P>
與 SQL Server CE 1.0 不同的是,這個版本為開發(fā)人員提供長錯誤說明,而不僅僅是錯誤號。錯誤說明機制是作為一個可選的 DLL 來實現(xiàn)的,您可以將該 DLL 放在設(shè)備上的 SQL Server CE 應(yīng)用程序路徑中。當(dāng)您調(diào)試應(yīng)用程序時,可以和應(yīng)用程序一起部署該 DLL。一旦您完成對應(yīng)用程序的調(diào)試,便可以從設(shè)備中刪除這個 DLL。
服務(wù)器功能
SQL Server CE 2.0 包括一個新的連接設(shè)置向?qū)Вㄟ^它就可以簡化虛擬目錄和數(shù)據(jù)訪問權(quán)限的創(chuàng)建(請參見圖 4)。用過 SQL Server CE 以前版本的人一定知道,在基于 Windows CE 的設(shè)備和 SQL Server 之間進(jìn)行通訊必須要有特定的虛擬目錄和訪問權(quán)限。使用這個連接向?qū)В梢栽谶\行 Microsoft Internet 信息服務(wù) (IIS) 的計算機上創(chuàng)建和管理虛擬目錄。此外,還可以在運行 IIS 和 SQL Server 的計算機上配置和管理 NTFS 權(quán)限。
與以前的版本類似,這個版本使用在 IIS 下運行的 ISAPI DLL,以便于運行 Windows CE 的設(shè)備和 SQL Server 2000 進(jìn)行通訊。這意味著,如果您的設(shè)備可以用 HTTP 訪問 SQL Server CE 虛擬目錄(也就是說您可以通過 Pocket Internet Explorer 瀏覽它),那么您便可以通過遠(yuǎn)程數(shù)據(jù)存儲 (RDA) 或合并復(fù)制功能連接到后端數(shù)據(jù)庫。
正如對于先前版本的 SQL Server CE 一樣,現(xiàn)在可以使用密碼或者將密碼與 128 位加密算法結(jié)合使用,來保護本地數(shù)據(jù)庫的安全。在本地數(shù)據(jù)庫中使用密碼將防止通過編程方式訪問本地數(shù)據(jù)庫,但無法防止從數(shù)據(jù)庫文件中以明文形式讀取任何數(shù)據(jù)。
結(jié)合使用密碼和加密將防止編程訪問,并將以加密形式存儲用戶數(shù)據(jù)。如果您使用的是 Pocket PC 2002 擴展,那么在默認(rèn)情況下,會安裝帶有 128 位加密的 SSL 本機 RSA 增強的 DLL。如果您使用的不是 Pocket PC 2002,將需要下載高度加密包 (http://www.microsoft.com/mobile/pocketpc/downloads)。
目前,Microsoft 建議您在 IIS 框中啟用 SSL,并使用基本身份驗證。Microsoft 計劃在以后的 Windows CE .NET 版本(4.x 和更高版本)中添加 Kerberos 支持。這將允許在 Windows 2000 或 .NET Server 與 CE.NET 設(shè)備之間委托憑據(jù)。一旦 Windows CE .NET 4.x 設(shè)備開始交付,SQL Server CE 2.0 將提供支持文檔來解釋如何利用 Kerberos 支持。
與 SQL Server 2000 相比,SQL Server CE 2.0 的另一個改進(jìn)是在支持索引的數(shù)量上。以前版本最多也就 32 個索引,而最新版本則支持 249 個索引。
SQL Server 客戶端數(shù)據(jù)提供程序是另一個包括在 SQL Server CE 2.0 中的組件。它是作為托管包裝實現(xiàn)的,允許應(yīng)用程序直接與后端 SQL Server 數(shù)據(jù)庫進(jìn)行交互。它應(yīng)該只用于連接有效的情形,在這種情況下,移動設(shè)備必須具備持續(xù)的網(wǎng)絡(luò)連接,并且不需要本地數(shù)據(jù)存儲。
SQL Server 客戶端數(shù)據(jù)提供程序提供的另一個選項是,通過提供程序來查詢 SQL Server 以檢索要存放在本地 SQL Server CE 數(shù)據(jù)庫中的數(shù)據(jù)的功能。
SQL Server CE 2.0 還包括一個對 ISQLW 的顯著改進(jìn)(請參見圖 5)。這是 SQL Server 企業(yè)管理器的 SQL Server CE 副本。您可以通過使用 ActiveSync® 進(jìn)行文件復(fù)制來將可執(zhí)行文件手動安裝到設(shè)備上。當(dāng)您第一次部署 Visual Studio .NET SDE 或 eMbedded Visual Tools 應(yīng)用程序時,ISQLW 將自動安裝到應(yīng)用程序的“開始”菜單上。

圖 5 ISQLW
在先前版本的 ISQLW 中,沒有一種查看數(shù)據(jù)庫架構(gòu)的簡便方法。除非您完整地記著該架構(gòu),否則編寫查詢會很困難。現(xiàn)在可以在樹形視圖中查看所有的數(shù)據(jù)庫對象,就好像在 SQL 查詢分析器的桌面版本中一樣。
SQL Server CE 2.0 提供了兩種基本方法來連接后端 SQL Server 數(shù)據(jù)庫:RDA 和合并復(fù)制。RDA 訪問功能支持與 SQL Server 7.0(和更高版本)數(shù)據(jù)庫的連接。另一方面,合并復(fù)制要求后端必須是 SQL Server 2000。有關(guān)這兩個連接選項的體系結(jié)構(gòu)關(guān)系圖,請參見圖 6。

圖 6 連接選項
SQL Server CE 2.0 中的 RDA 為基于 Windows CE 的應(yīng)用程序提供了一種簡單方法,用來從遠(yuǎn)程 SQL Server 數(shù)據(jù)庫表中提取數(shù)據(jù),并將數(shù)據(jù)存儲在本地設(shè)備的數(shù)據(jù)庫表中。然后,應(yīng)用程序可以讀取和更新本地數(shù)據(jù)庫表。SQL Server CE 可以跟蹤對本地數(shù)據(jù)庫表作出的所有更改。利用這些信息,應(yīng)用程序可以在以后將更改的記錄從本地表推入到遠(yuǎn)程 SQL Server 數(shù)據(jù)庫表中。
基于 Windows CE 的應(yīng)用程序還能使用 RDA 提交要在遠(yuǎn)程 SQL Server 數(shù)據(jù)庫上執(zhí)行的 SQL 語句。例如,應(yīng)用程序可以將用來插入、更新、刪除記錄的語句提交到遠(yuǎn)程 SQL Server 表。
有了 SQL Server CE,RDA 就可以基于 Internet。簡單地說,SQL Server CE 通過 IIS 與后端 SQL Server 數(shù)據(jù)庫進(jìn)行通訊。通過借助于 IIS 建立連接,RDA 利用 IIS 的身份認(rèn)證和授權(quán)服務(wù)。由于通訊協(xié)議是 HTTP,因此運行 SQL Server 的計算機可以放在防火墻后面,并能通過 Microsoft ISA Server(或 Microsoft Proxy Server)提供的發(fā)布規(guī)則來訪問。
為了減少數(shù)據(jù)傳輸量,RDA 使用壓縮機制。這使得 RDA 更適合無線傳輸。可以使用加密機制來保護用戶的敏感數(shù)據(jù)。RDA 還具有一種處理通訊失敗的機制。如果發(fā)生失敗,則重新傳輸機制將從最后一個成功傳輸?shù)南⒕彌_區(qū)重新開始。
RDA 控件提供了對 SQL Server 2000 或 SQL Server 7.0 數(shù)據(jù)庫的編程訪問。RDA 訪問是由 Visual Studio .NET 或 eMbedded Visual Tools 應(yīng)用程序提供的。
SQL Server CE 合并復(fù)制是基于 SQL Server 2000 的,它使用同一個發(fā)布服務(wù)器/訂閱服務(wù)器模型。使用合并復(fù)制可以讓數(shù)據(jù)獨立于設(shè)備和服務(wù)器進(jìn)行更新。當(dāng)設(shè)備以后連接到服務(wù)器時,便會進(jìn)行數(shù)據(jù)同步。在創(chuàng)建訂閱之前,必須配置 SQL Server 2000 復(fù)制、創(chuàng)建 SQL Server 發(fā)布(包括設(shè)置一個共享快照文件夾以存儲發(fā)布的數(shù)據(jù)),然后為匿名訂閱啟用發(fā)布功能。
SQL Server CE 復(fù)制對象具備增加和刪除訂閱的方法,以及針對某個訂閱初始化、調(diào)用和終止合并復(fù)制的方法。盡管正確配置后其編程并不難,但 SQL Server 的復(fù)制機制比 RDA 的更完善也更復(fù)雜。
SQL Server CE 2.0 有一個令人興奮的新特性,那就是增加了 SQL Server CE 托管提供程序(或包裝),它為使用 .NET Compact Framework 的 Visual Basic .NET 和 C# 移動應(yīng)用程序提供了一個互操作性層。如果您已經(jīng)在桌面應(yīng)用程序中使用了 ADO.NET,那么您會覺得在 .NET Compact Framework 中使用 SQL Server CE 托管提供程序會很爽。這種編程模型以很直覺的方式使您能夠與 SQL Server CE 數(shù)據(jù)庫進(jìn)行交互。
該包裝實際上利用本機 SQL Server CE DLL。其優(yōu)點是,eMbedded Visual Basic(或 eMbedded Visual C++)應(yīng)用程序和 Visual Studio .NET 應(yīng)用程序可以在同一臺設(shè)備上并行運行。但是,這并不意味著就可以對同一個 SQL Server CE 數(shù)據(jù)庫進(jìn)行并發(fā)訪問。它只意味著用兩種平臺編寫的應(yīng)用可以在同一臺設(shè)備上共存。SQL Server CE 仍然是一個單用戶數(shù)據(jù)庫引擎。
.NET Compact Framework 中增加了兩個可支持托管代碼的命名空間。它們是:System.Data.SqlClient 和 System.Data.SqlServerCe。同時,一個名為 System.Data.SqlServerCE.SqlCeException 的類為 Visual Basic .NET 和 C# 提供了 try/catch 支持。
為了描述應(yīng)用程序中使用合并復(fù)制的新托管代碼包裝的強大功能,對 Synchronize 方法的一次調(diào)用會將整個數(shù)據(jù)庫架構(gòu)以及底層數(shù)據(jù)下載到設(shè)備上,而無需編寫一行數(shù)據(jù)描述語言 (DDL)。
編寫應(yīng)用程序
現(xiàn)在讓我們用一個代碼項目來說明 SQL Server CE 2.0 的新功能。我們將用 Visual Studio .NET 和 .NET Compact Framework 創(chuàng)建一個簡單的 C# SmartDevice 應(yīng)用程序。我們將該應(yīng)用程序部署到 Pocket PC 2002 模擬器上,以便簡化開發(fā)和測試。
在本例中,我們將使用在安裝 .NET Compact Framework SDK 附帶的 NorthwindCE 示例應(yīng)用程序時創(chuàng)建的數(shù)據(jù)庫。如果您很熟悉 SQL Server,那么有可能已對 SQL Server 2000 提供的 Northwind 數(shù)據(jù)庫非常熟悉。NorthwindCE 示例應(yīng)用程序包括一個名為 SetupRepl.bat 的安裝腳本,該腳本將創(chuàng)建一個名為 Nwind_SQLCE 的數(shù)據(jù)庫副本。該腳本還在運行 SQL Server 2000 的計算機上安裝一個帶有本地分發(fā)服務(wù)器的發(fā)布服務(wù)器。此外,它從 Nwind_SQLCE 數(shù)據(jù)庫創(chuàng)建一個名為 SQLCEReplDemoNet 的合并發(fā)布。我們將指示示例應(yīng)用程序訂閱該發(fā)布。

圖 7 新發(fā)布
一旦 SQL Server 實例被配置為一個復(fù)制的發(fā)布服務(wù)器/分發(fā)服務(wù)器,并具備一個定義了相應(yīng)權(quán)限的快照文件夾,那么您就可以運行 NorthwindCE 示例附帶的 SetupRepl.bat。如果一切正常,您應(yīng)該看到發(fā)布已成功創(chuàng)建,如圖 7 所示。
應(yīng)用程序概述
我們設(shè)計的應(yīng)用程序?qū)㈥U釋本文前面討論的 SQL Server CE 2.0 的新功能,例如,如何使用 SqlCeReplication.Synchronize 方法來執(zhí)行復(fù)制。我們將演示 SQL Server 2000 Nwind_SQLCE 數(shù)據(jù)庫和本地 SQL Server CE 訂閱數(shù)據(jù)庫之間完整的(雙向)同步,以及其他功能(例如,新的 SqlCeException 對象和使用參數(shù)化查詢)。

圖 8 Windows 窗體
圖 8 顯示了我們?yōu)?SmartDevice 應(yīng)用程序設(shè)計的 Windows 窗體。該應(yīng)用程序允許我們通過輸入姓這一部分來查詢本地訂閱數(shù)據(jù)庫的 Employees 表,并將在 ListView 控件中顯示結(jié)果。我們還添加了一個 Synchronize 菜單項,它使我們能將 SQL Server 2000 數(shù)據(jù)庫的任何更改強制復(fù)制到本地 SQL Server CE 訂閱數(shù)據(jù)庫。SmartDevice 可能不是一個令人興奮的應(yīng)用程序,但其中充滿了趣味!
在開始前,我們假定您已經(jīng)運行了 NorthwindCE 示例中的 SetupRepl.bat 腳本。確保 SQL Server CE 服務(wù)器代理已經(jīng)用名為“sqlce”的 IIS 虛擬目錄進(jìn)行了配置,并且使用 HTTP 匿名訪問(這對于生產(chǎn)應(yīng)用程序來說無疑不是最佳做法)。您可以通過使用 SQL Server CE 2.0 所附帶的 SQL Server CE 連接管理 MMC 管理單元來驗證這些設(shè)置。
我們將要查看的代碼的第一部分演示了如何使用 SQL Server CE SqlCeEngine 對象來創(chuàng)建一個空的數(shù)據(jù)庫,以及如何使用 Replication 對象來完成將現(xiàn)有 SQL Server 發(fā)布與 Nwind_SQLCE 數(shù)據(jù)庫進(jìn)行同步。DBInit 函數(shù)是從 Form_Load 事件調(diào)用的。它首先創(chuàng)建一個空的訂閱數(shù)據(jù)庫(如果不存在的話),然后調(diào)用 DBSync 來將發(fā)布數(shù)據(jù)庫與訂閱數(shù)據(jù)庫同步(請參見圖 9)。
在 DBSync 方法中,為了方便示范和說明,我們對 Replication 對象的所有屬性進(jìn)行了硬編碼。很顯然,您將希望在應(yīng)用程序定義的某種存儲區(qū)(例如,SQL 表或 XML 文件)中維護這些屬性。在本例中,我們使用的是 SQL Server 身份驗證。Synchronize 方法創(chuàng)建訂閱數(shù)據(jù)庫,并獲得該發(fā)布中所有數(shù)據(jù)庫對象的整個架構(gòu)(包括相關(guān)索引),如圖 10 所示。
在訂閱數(shù)據(jù)庫創(chuàng)建之后,發(fā)布中的所有對象便在本地進(jìn)行復(fù)制,我們可以在斷開連接的情況下使用應(yīng)用程序。不管是 SQL Server 2000 數(shù)據(jù)庫的更改還是 SQL Server CE 數(shù)據(jù)庫的更改,都可以在下次調(diào)用 DBSync 方法時使用合并復(fù)制功能來完成。
請注意,在 SDE 應(yīng)用程序中捕獲異常的 try...catch...finally 構(gòu)造技術(shù)。通過 ShowErrors 方法可以顯示 SQL Server CE 異常的詳細(xì)信息。圖 11 中的代碼顯示如何拆分 SQL Server CE 異常堆棧,并在客戶端上的消息框中顯示它。
最后我們要展示的代碼示例是 FindEmployees方法,它從“Find Now”按鈕的 Click 事件調(diào)用。該方法首先實例化一個 SqlCeConnection 對象,然后連接到本地訂閱數(shù)據(jù)庫。
接著,我們構(gòu)造一個 SqlCeCommand 對象,該對象由針對 Employees 表的參數(shù)化查詢組成,如圖 12 所示。請注意我們是如何使用 RTRIM 內(nèi)部函數(shù)來刪除 FirstName 和 LastName 列的尾部空格的,這樣可以在 ListView 控件中進(jìn)行精細(xì)的格式化。
使用 SqlCeCommand 對象的 Parameters 集合,我們可以傳入要與 SELECT 語句的 LIKE 運算符一起使用的搜索模式。最后,我們用 SqlCeDataReader 來執(zhí)行查詢并填充 ListView 控件,然后關(guān)閉并釋放已經(jīng)打開的、到訂閱數(shù)據(jù)庫的連接。

圖 13 Pocket PC模擬器
圖 13 顯示了所完成的應(yīng)用程序在 Pocket PC 2002 模擬器中運行時的外觀。
部署時的考慮事項
最后,我們要回顧在將應(yīng)用程序部署到現(xiàn)場時應(yīng)考慮的幾件事情。盡管 SQL Server CE 數(shù)據(jù)庫引擎本身非常可靠,但是它運行的任何設(shè)備都有可能失敗(這主要是由于電池壽命有限)。因此,您開發(fā)的任何移動解決方案始終都應(yīng)該考慮到災(zāi)難恢復(fù)。
通過使用諸如 CF Media 之類的持續(xù)性內(nèi)存技術(shù)可以實現(xiàn)持久存儲。為了讓用戶能在需要冷啟動的事件中恢復(fù)數(shù)據(jù),應(yīng)規(guī)劃在 CF 中存儲應(yīng)用程序數(shù)據(jù)庫和應(yīng)用程序可執(zhí)行文件。為您的應(yīng)用程序創(chuàng)建一個 CAB 文件可以大大簡化員工在現(xiàn)場安裝應(yīng)用程序的過程。