程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 用SQL Server CE 2.0和.NET Compact Framework開發……

用SQL Server CE 2.0和.NET Compact Framework開發……

編輯:關於VC++

用SQL Server CE 2.0和.NET Compact Framework開發緊湊而功能強大的移動應用程序

本文假定你熟悉SQL Server和Visual Studio。

概要

開發人員在為移動設備創建解決方案時可以有很多種選擇。最大的挑戰之一是找到一種既緊湊又健壯的本地存儲方案。SQL Server CE 2.0 承諾在產品交付時兩者兼備。其最新版本將比以往的版本在特色和性能上都有一個巨大的飛躍。本文將回顧開發人員目前在使用開發平台和開發工具上的一些選擇。作者也將比較和總結 SQL Server CE 2.0 的新特色,並且將舉一些例子來說明。

近年來,移動設備的爆炸性增長,也促使消費者和企業對新型移動應用的需求。在這種背景下,微軟建立了許多工具和框架,使軟件開發 人員可以充分發掘這些智能設備的能力。將這些工具集和廣泛的設備組合起來便可以創建最先進的移動應用。

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 操作系統版本甚至比那些可獲得的面向消費者的設備的操作系統版本更新 。最新的OEM 設備采用版本為4.x 的Windows CE。 這些設備缺省包括 .NET Compact Framework。這對想利用Microsoft 下一代工具和框架優點的企業開發人員來說非常有吸引力,

Windows CE 也加進了各種各樣有趣的硬件技術,包括 CF( Compact Flash)閱讀器、條形碼掃描器、磁條讀取器、全球定位系統(GPS)、指紋 鑒定和照相技術等。Figure 1 說明了當今發展中企業利用基於Windows CE 的工具和設備開發 的典型移動應用解決方案。顯而易見,這些移動設備需要一個簡潔而健壯的本地存儲解決方案。

移動應用開發人員最大的挑戰是移動設備上可獲得的內存較小(一般為 16MB-32MB)。移動設備的內存增加的越多,其應用程序也就越復雜。當然,本地存儲機制必須 具備一個小規模內存空間。考慮內存問題的同時,應用程序很可能還要實現針對本地存儲的復雜查詢。

此外,這些應用程序處於在線狀態或不在線狀態時都必須工作得一樣好。這就必要具備本地和遠程數據存取 APIs,以及與後台數據進行某種形式的同步。幸運的是,SQL Server CE 2.0 提供了 生成滿足這些要求的應用程序的框架。

處於離線模式時,SQL Server CE 提供設備自身本地的存儲。數據庫的變化可以在設備上被可靠地追蹤,當重新建立連接時,它就可以和後台數據庫進行同步。服務器端數據 的變化亦然。SQL Server CE 支持合並復制(Merge Replication)的特性。當與 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 需要在設備上安裝 Windows CE 3.x 或更高版本的操作系統。

使用 Microsoft 的下一代工具和框架,快速開發移動應用程序將成為可能。隨著移動應用程序開發轉向 Windows .NET 平台,移動應用程序將可以 利用當今桌面平台具有的許多創新。用 eMbedded Visual Basic 或 Visual C++ 開發的程序將升級到Visual Basic .NET、 C#、和 ADO.NET。

Microsoft 已經向世人展示了他們的智能設備擴展(SDE:Smart Device Extensions),它可以讓移動應用開發人員利用基於Visual Studio® .NET 的統一 的工具集。Visual Studio® .NET 與 SDEs 結合為創建基於Windows CE 的應用程序提供了一個無縫的集成的開發平台。

Visual Studio .NET 的下一個版本(代號為“Everett”)將對 .NET Compact Framework、Pocket PC 200x和Windows CE .NET 4x 設備提供根本的支持。

SQL Server CE 2.0 語言特性

SQL Server CE 包含自身特有的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 也支持文件級的存取控制機制,叫數據庫密碼。每次打開數據庫時必須傳遞這個密碼。在特定的提供者的DBPROP_SSCE_DBPASSWORD 屬性 中——屬性集 DBPROPSET_SSCE_DBINIT 應該被用於設定這個值。當創建一個新數據庫時,該屬性可以被用來指定一個必須使用的密碼。

所有的內建功能以及 SQL Server 2000 中最受歡迎功能也將被支持。現在你可以在查詢中使用數學的、字符串和系統函數來完成操作並返回標量值。以前你需要 用 eMbedded Visual Basic (或 eMbedded Visual C++)函數來實現。 與 SQL Server CE 1.0 相比,內建函數的使用贏得了巨大的性能。

例如,為了讓 ListBox 中的結果更容易格式化輸出,Figure 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 (使用 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)是另一個新特性。程序調用 Pull 方法從 SQL Server 數據庫中取得數據,並將它們存放在SQL Server CE的數據庫表中。 最初的SQL Server CE 版本只支持表的主鍵。SQL Server CE 2.0 則支持主鍵和所有其它的附加索引。

在程序中使用 Pull 方法能追蹤 SQL Server CE 表的變化,通過設置適當的跟蹤選項。SQL Server CE 跟蹤所有的插入、更新和刪除操作(見 Figure 3 )。

與 SQL Server CE 以前版本相比,新版本的另一個改進是加入了更加健壯的異常處理。正如你可能在前面代碼段中所注意到的那樣,在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 包括一個新的連接設置向導,通過它就可以簡化虛擬目錄的創建和數據存儲許可(見 Figure 4 )。使用過SQL Server CE 以前版本的人一定知道基於Windows CE 的設備和 SQL Server 之間的通信必須要有特定的虛擬目錄和存取權限。使用這個連接向導,你可以在運行 IIS 服務的計算機上創建並管理虛擬目錄。此外,你可以在運行 IIS和SQL Server的計算機上配置並管理 NTFS 許可。

與以前的版本類似,這個版本使用運行在IIS 下的ISAPI DLL 協助 Windows CE 設備和 SQL Server 2000 之間的通訊。這意味 著如果你的設備可以用 HTTP 訪問 SQL Server CE 虛擬目錄( 也就是說你可以通過Pocket Internet Explorer 浏覽它),那麼你便可以通過遠程數據存儲(RDA:Remote Data Access)或合並復制連接到後台數據庫。

在以前的SQL Server CE 版本基礎上,現在可以用密碼或 128 位加密的密碼來保護本地數據庫的安全,在本地數據庫中使用密碼將防止通過編程存取本地數據庫,但 無法防止讀取數據庫中的任何明文數據。 

密碼和加密一起使用就可以防止編程存取並且用戶數據以加密形式存儲。如果使用 Pocket PC 2002 擴展,那麼在默認情況下會安裝 128 位本地 SSL 增強 RSA DLL。如果你還沒有使用 Pocket PC 2002,則必須下載高強度加密包:(http://www.microsoft.com/mobile/pocketpc/downloads)。

Microsoft 通常建議在你的IIS 中啟用 SSL 並使用基本身份驗證(Basic Authentication)。Microsoft 計劃在以後的Windows CE .NET 版本中 (4.x 或更高) 增加 Kerberos 支持。這將允許 Windows 2000 或 .NET 服務器與 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 客戶端數據提供者(The SQL Server Client Data Provider)是另一個包含在SQL Server CE 2.0 中的組件。它是作為受管包裝器實現的,允許應用程序直接與後台 SQL Server 數據庫進行交互。 它應該只用於良好連接的情形,在這種情況下,移動設備必須具備持續的網絡連接,並且不需要本地數據存取。

使用 SQL Server 客戶端數據提供者的另一個選擇是能夠通過它(The SQL Server Client Data Provider)查詢 SQL Server 讀取存放在本地 SQL Server CE 數據庫中數據。

SQL Server CE 2.0 還包括一個對 ISQLW 的顯著改進(見 Figure 5)。可以說這是SQL Server CE 中的SQL Server 企業管理器(SQL Server Enterprise Manager)。你可以通過使用 ActiveSync® 進行文件拷貝 ,在設備上手動安裝可執行程序。當你第一次部署 Visual Studio .NET SDE 或 eMbedded Visual Tools 程序時,ISQLW 將 被自動安裝在設備的開始菜單上。

Figure 5 ISQLW

以前的ISQLW 沒有一種容易的方法來查看數據庫大綱(schema)。它使得編寫查詢代碼很困難,除非完整地記憶大綱。現在可以在樹形視圖中查看 所有數據庫對象,非常象桌面版本的SQL 查詢分析器(SQL Query Analyzer)。

SQL Server CE 2.0 提供了兩種基本方法來連接後台 SQL Server 數據庫:RDA 和合並復制。RDA 支持與 SQL Server 7.0 (和以後的版本) 數據庫的連接。另一方面,合並復制要求後台必須是SQL Server 2000。Figure 6 是這兩種方法的構架圖表。

Figure 6 連接選項

RDA 在SQL Server CE 2.0 中為 Windows CE 程序提供了一種簡單的方法從遠程 SQL Server 數據庫表中 拉(pull)數據,並將數據存儲在本地設備的數據庫表中。此時你的程序可以讀取和更新本地數據庫的表。SQL Server CE 可以跟蹤本地數據庫表的所有變化。利用這些信息,應用程序可以 在以後將變化後的記錄從本地表推(push)到遠程 SQL Server 數據庫表中。

基於Windows CE 的應用程序還能通過RDA 提交 SQL 語句,並在遠程 SQL Server 數據庫上執行。例如,程序可以提交諸如插入、更新、刪除記錄 等語句給遠程 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 復制(Replication)對象具備增加、刪除、訂閱的方法,初始化和調用的方法以及終止某個訂閱的合並復制(Merge Replication)的方法。盡管正確配置後其規劃並不難,但 SQL Serve 的復制機制比 RDA 的更完善也更復雜。

SQL Server CE 2.0 的一個令人興奮的新特性是增加了 SQL Server CE Managed Provider (或包裝器),它為使用 .NET Compact Framework 的Visual Basic .NET和C# 移動程序提供了一個互用性層。如果你已經在桌面程序中使用 ADO.NET, 那麼你會覺得在.NET Compact Framework 中 使用 SQL Server CE Managed Provider 很爽。這種編程模型 以很直覺的方式給予你和 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 支持。

為了描述在應用程序中新的使用合並復制(Merge Replication)的受管代碼包裝器的強大功能,對 Synchronize 方法的一次調用將 獲取整個數據庫大綱以及底層數據,不必編寫一行數據描述語言(DDL)語句。

開發一個應用程序

現在讓我們用一個代碼工程來示范 SQL Server CE 2.0 的這些新特性。我們將用 Visual Studio .NET和.NET Compact Framework 創建一個簡單的C# 智能設備程序。我們將這個程序部署到 Pocket PC 2002 模擬器上以便簡 化開發和測試。

由於是以示范為目的,我們將使用安裝 NorthwindCE 例子程序時創建的數據庫,使用 .NET Compact Framework SDK。如果你很熟悉 SQL Server , 那麼肯定對 SQL Server 2000 中 Northwind 數據庫了然於心。NorthwindCE 例子程序包括了一個名為 SetupRepl.bat 的安裝腳本。它將創建一個叫 Nwind_SQLCE 的數據庫的拷貝。該腳本還在運行 SQL Server 2000 的機器上安裝一個帶有本地分發人的發行者。此外,它從 Nwind_SQLCE 數據庫創建一個名為 SQLCEReplDemoNet 的合並 發行。我們將讓例子程序訂閱該發行。

Figure 7 新的發行

一旦你的SQL Serve 實例被配置為一個復制的發行人/分發者並具備一個定義了相應許可的快照目錄。那麼你就可以運行 NorthwindCE 例子的SetupRepl.bat 腳本。如果一切正常,你應該看到發行被成功創建,見 Figure 7。

應用程序回顧

我們設計的應用程序將舉例說明本文前面討論的SQL Server CE 2.0 新特性,比如,如何用 SqlCeReplication.Synchronize 方法實現復制。這裡將演示 SQL Server 2000 Nwind_SQLCE 數據庫和本地 SQL Server CE訂閱數據庫之間完整的(雙向)同步。以及其它特性,如新的SqlCeException 對象和使用參數化查詢。

Figure 8 Windows 窗體

Figure 8 顯示了我們為 SmartDevice 程序設計的Windows 窗體。該程序允許通過輸入名字中的姓來查詢本地訂閱數據庫的客戶表,並 在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 Connectivity Management MMC snap-in )驗證這些設置。

代碼的第一部分演示如何使用 SQL Server CE SqlCeEngine 對象來創建一個空的數據庫,以及如何使用 Replication 對象來完成與現有 SQL Server 發行者針對 Nwind_SQLCE 數據庫的同步。Form_Load 事件調用 DBInit 函數。它首先創建一個空的訂閱數據庫(如果不存在的話),並調用 DBSync 來同步 發行數據庫和訂閱數據庫(見 Figure 9 )。

在DBSync 方法中,為了方便示范和說明,我們硬編碼(寫死)所有 Replication 對象的屬性。顯然你應該自己維護這些應用程序定義的數據,如 SQL 表或者 XML 文件,在我們的例子中使用 SQL Server 身份認證。Synchronize 方法創建訂閱數據庫,並在該發行中獲取整個數據庫對象的大綱方案,包括相關索引,如 Figure 10 所示。

一旦訂閱數據庫被創建,發行中的所有對象便被本地復制,從而使我們可以在斷開連接的情況下仍然可以使用應用程序。不管是SQL Server 2000 數據庫的變化還是SQL Server CE 數據庫的變化通過下次調用 DBSync 方法時用復制合並解決。

請注意在SDE 程序中捕獲異常的try...catch...finally 構造技術。通過ShowErrors 方法可以顯示 SQL Server CE異常的詳細信息。Figure 11 中的代碼示范了如何拆分 SQL Server CE異常堆棧並 在客戶端的消息框中顯示。

最後我們要解釋的代碼例子是FindEmployees 方法,它在“Find Now” 按鈕的單擊事件中被調用。這個方法首先實例化一個 SqlCeConnection 對象, 然後建立到本地訂閱數據庫的連接。

下一步,我們構造 SqlCeCommand 對象,它由對 Employees 表的參數化查詢組成,如 Figure 12 所示。注意如何使用RTRIM 內建函數來刪除 FirstName和LastName 的尾部空格,從而可以在ListView控件中進行精細的格式化輸出。

使用SqlCeCommand對象的參數集合,我們可以在想要使用的搜索模式中傳遞帶有 LIKE 操作符的SELECT 語句。最後,我們用 SqlCeDataReader 來執行查詢並 在ListView控件顯示結果,然後關閉並釋放到訂閱數據庫的連接。

Figure 13 Pocket PC 模擬器

Figure 13 顯示了例子程序在Pocket PC 2002 模擬器中運行的畫面。

部署應用程序要考慮的事項

最後,我們要考慮的事情是如何部署你的應用程序。盡管 SQL Server CE 數據庫引擎本身非常可靠,但由於電池容量的局限,任何它運行的設備都有可能失敗。因此,你開發的任何移動 解決方案都應該考慮到災難恢復。

通過使用諸如 CF 卡之類的持續化內存技術可以實現持久保存。為了讓用戶在冷啟動時能恢復數據,應規劃在CF 卡中保存應用程序數據庫和可執行文件。為你的程序建立一個 CAB 文件可以 大大簡化工作人員安裝程序的過程。

SQL Server CE 2.隨時待命

SQL Server CE 2.0 將使你開始著手為移動設備建立自己的的企業級數據管理解決方案。與以前的版本相比,新版本的SQL Server CE 在特性和性能方面有了質的飛躍。我們鼓勵每一個人都來使用這個令人興奮的版本,用它開始建立下一個“殺手級”的移動應用程序。你可以從網上下載 SQL Server CE 2.0,網址是http://www.microsoft.com/sql/ce/downloads/ce20.asp 。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved