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

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

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

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

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

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