摘 要: 針對嵌入式平臺下數據庫應用日益廣泛的實際,建立在嵌入式操作系統背景下的簡單、高效、實用的數據庫訪問方法成為必要。在此主要對在Windows CE.Net平臺下如何利用ADOCE技術訪問SQL Server CE 2.0數據庫進行了討論,其中重點闡述了數據庫連接的建立和怎樣通過SQL語句對數據庫進行各式訪問操作,最后給出了運用ADOCE技術訪問SQL Server CE 2.0數據庫的程序運行實例,結果表明這種方法滿足對嵌入式數據庫的訪問需求。
關鍵詞: Windows CE.Net; ADOCE; SQL Server CE 2.0數據庫; 嵌入式操作系統
中圖分類號: TN919?34; TP311.13 文獻標識碼: A 文章編號: 1004?373X(2013)20?0071?03
0 引 言
隨著當代科技日新月異的發展,作為新興產物的嵌入式移動信息設備在人類生活領域的應用越來越廣泛。這些嵌入式設備中的PDA以其體積小、重量輕、便于攜帶、功能強大、功耗低等特點而被受青睞。嵌入式設備的數據庫管理作為PDA的一個重要功能在各行各業的應用也越來越豐富,已成為人們關注的焦點,如:數據字典、車載衛星導航設備、移動設備上的網上追逃等應用歸根結底就是數據庫的應用。嵌入式移動數據庫系統是支持移動計算或某中特定計算模式的數據庫管理系統,數據庫系統與操作系統、具體應用集成在一起,運行在各種智能型嵌入式設備或移動設備上[1]。目前流行的嵌入式數據庫有:Raima提供的Raima Data Manager for CE;Sybase提供的Adaptive Server Anywhere for CE;Oracle提供的Oracle lite for CE;Pocket Access以及Microsoft提供的SQL Server CE。本文將主要介紹在Windows CE.Net操作系統下通過ADOCE技術訪問微軟的SQL Server CE 2.0數據庫的實現與應用實例。
1 Windows CE.Net介紹
Windows CE是Microsoft專門為信息設備、移動應用、消費類電子產品、嵌入式應用等非PC領域而全新設計的戰略性嵌入式操作系統產品。Windows CE的設計目標是:模塊化以及可伸縮性、實時性能好、通信能力強大、支持多種CPU[2]。
Windows CE.Net是Windows CE 3.0的后續產品,它不僅是一個功能強勁的實時嵌入式操作系統,而且提供了眾多強大工具,允許用戶利用它快速開發出下一代的智能化小體積連接設備。借助于完善的操作系統功能和開發工具,Windows CE.Net為開發人員提供了構建、調試和部署基于Windows CE.Net的定制設備所需的一切特性。
Windows CE.Net操作系統可以支持多種數據庫操作,它自身就自帶有一種數據庫CCeDBDatabase,可以通過MFC為Windows CE.Net提供的4個數據庫類對其進行操作。
2 SQL Server CE 2.0介紹
SQL Server CE 2.0的全名是SQL Server 2000 Windows CE Edition version 2.0。SQL Server CE 2.0是運行在Pocket PC以及其他Windows CE平臺上的一個很簡化的SQL Server 2000/7.0,是用作快速開發的關系型精簡數據庫,它將企業數據管理能力擴展到了基于Windows CE操作系統的嵌入式移動設備上。這個數據庫可以和PC機上的SQL Server數據庫同步,而且用它操作數據庫的效率是比較高的。
3 ADO和ADOCE介紹
ADO 是 Microsoft 為所有數據類型提供的戰略性高級接口,它是微軟對OLEDB的封裝。采用 ADO 的應用程序可以通過 OLE數據庫提供程序訪問并處理數據庫服務器中的數據。ADO 的主要優點是:使用簡單、速度高、內存占用少、磁盤占地面積少。
ADO 提供了一致的、高性能的數據訪問方式,可以使用應用程序、工具、語言甚至是 Internet 瀏覽器創建前端數據庫客戶機程序或中層業務對象。
ADOCE 提供了 ADO for Windows CE 操作系統的一個子集,其中包括 Recordset 和 Field 對象的實施過程。ADOCE 能夠啟動對存儲于本地設備中的數據庫的訪問功能,并為網絡數據庫中的數據提供同步功能,從而在 Windows CE 操作系統中增加了新的數據庫功能。
ADOCE 可以由 eMbedded Visual C++ 4.0等任一實現了 COM 的環境中訪問 Windows CE數據庫引擎。
4 訪問SQL Server CE 2.0數據庫的實現與
應用
應用程序不能直接訪問SQL Server CE 2.0數據庫文件,它要操作數據庫文件還必須具備兩大要素:數據庫訪問方式(代理)和數據庫引擎。本文介紹的方法就是應用程序以ADOCE的方式訪問SQL Server CE 2.0數據庫引擎,通過數據庫引擎操作數據庫文件。
在一些情況下(如查詢操作)將產生ADOCE記錄集,供應用程序下一步操作。應用程序訪問SQL Server CE 2.0數據庫流程如圖1所示。
4.1 ADOCE和SQL Server CE 2.0數據庫的注冊
在Windows CE.Net系統下ADOCE和SQL Server CE 2.0數據庫都不能直接使用,需要通過REGSVRCE.EXE將它們的DLL文件進行注冊。共涉及到的DLL文件有7個,其中ADOCE有3個(adoce31.dll,adoxce31.dll,adoceoledb31.dll),SQL Server CE 2.0數據庫有4個(ssce20.dll,msdaeren.dll,ssceca20.dll,ssceerror20en.dll),這些動態連接庫文件都需要預先放置在目標機的Windows目錄下。下面是應用程序(以eMbedded Visual C++ 4.0為例)對adoce31.dll進行的動態注冊:
CreateProcess(_T(\"\\Windows\\RegSvrCe\"),_T(\"/s\\Windows\\adoce31.dll\"),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
其余幾個DLL文件的注冊與此類似,這里不做介紹。
數據庫流程圖
4.2 創建SQL Server CE 2.0數據庫連接實例
創建數據庫連接是訪問數據庫的第一步。在常用的Windows操作系統下SQL Server數據庫的存儲格式與基于Windows CE.Net平臺的存儲格式是不同的。在Windows環境下SQL Server數據庫的存儲格式是mdf,而在Windows CE.Net系統下則是以sdf格式存在的。這在創建數據庫連接時需要特別注意,下面介紹建立數據庫連接的具體步驟。
4.2.1 創建數據庫文件
在建立數據庫連接之前,需要先創建SQL Server CE 2.0數據庫,建立數據庫的方法比較常見的有兩種,一種是通過程序創建,即采用SQL語句中的create database命令,另一種比較簡單的創建數據庫方法,就是運用SQL Server CE中的查詢分析器來可視化創建數據庫,本文采用查詢分析器來建立數據庫BoardStore.sdf。
4.2.2 創建數據庫提供者實例
定義數據庫連接:
IADOCEConnection * m_Conn;
給定數據庫連接參數:
TCHAR tsADOCE30ConnProgID[]= TEXT(\"ADOCE.Connection.3.1\");
IID IID__Connection =
{0x113033DE,0xF682,0x11D2,{0xBB,0x62,0x00,0xC0,0x4F,0x68,0x0A,0xCC}};
//ADOCE連接對象GUID。
初始化COM組件,建立數據庫連接實例:
CoInitializeEx(NULL,COINIT_MULTITHREADED);
hr=CLSIDFromProgID(tsADOCE30ConnProgID,tClsid);//獲取ADOCE的CLSID
hr=CoCreateInstance (tClsid, NULL,
CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER,
IID__Connection, (LPVOID *)m_Conn);
將數據庫連接與數據庫文件相關聯:
_tcscpy(pszProvider, _T(\"Provider = Microsoft.SQLSERVER.OLEDB.CE.2.0;Data Source=\\Storage Card\\BoardStore.sdf\"));
hr = m_Conn?>Open(pszProvider,TEXT(\"\"),
TEXT(\"\"),adOpenUnspecified);
其中,Data Source是數據庫文件存放的位置,需使用絕對路徑。這里Open()函數的2、3參數是設置數據庫用戶名和密碼用的,由于數據庫BoardStore.sdf未設置用戶名和密碼,所以參數為空。
4.2.3 創建數據記錄集實例
成功建立數據庫連接后,就可以在數據庫連接的基礎上建立記錄集了,創建記錄集和創建數據庫連接的過程非常相似,僅需要修改一下參數。
創建記錄集實例:
hr=CLSIDFromProgID( tsADOCE30RSProgID, tClsid );
hr = CoCreateInstance (tClsid, NULL,
CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER,
IID__Recordset,(LPVOID *)m_Reset);
將記錄集與數據庫連接相關聯:
hr=m_Reset?>put_ActiveConnection(varConn1);
參數varConn1為剛才已經建立的數據庫連接,到目前為止訪問數據庫的準備工作就已經做完了。
4.3 訪問SQL Server CE 2.0數據庫應用實例
建好數據庫連接和記錄集,就可以通過執行SQL語句對數據庫進行訪問操作,數據庫操作主要有建立表、刪除表、查詢記錄、刪除記錄、添加記錄、修改記錄、排序等。下面對應用最為廣泛的查詢記錄、刪除記錄和添加記錄操作做一個詳細的介紹(以某衛星定位系統中的定位數據管理為例)。
4.3.1 查詢記錄
查詢記錄是通過SQL語句將待查詢的記錄首先放進先前建立的記錄集中,然后通過Move、get_Fields、get_Value等函數將數據解析出來。代碼如下:
str.Format(_T(\"select * from pos where ID=%d\"),m_uesrID);
hr=m_Reset?>Open(_variant_t(str),varConn1,
adOpenStatic,adLockReadOnly,adCmdUn);known
其中,參數adOpenStatic表示靜態打開記錄集,參數adLockReadOnly表示打開的記錄集為只讀方式,不能對其修改。如果不設定查詢條件,則將POS表中的全部記錄查詢到記錄集中了。需要繼續查詢,則將前面的查詢結果記錄集關閉。
4.3.2 刪除記錄
刪除記錄的方式有兩種:一種是將要刪除的記錄以動態記錄集方式查詢出來,然后在記錄集中刪除它們,同時將數據庫文件中對應的數據也一并刪除了;另一種就是通過數據庫連接執行SQL命令DELETE將記錄直接從數據庫文件刪除。本定位系統采用了第二種方法,代碼如下:
provider.Format(_T(\"DELETE FROM Pos WHERE Time like ′%s′And Id=%s\"),m_strtime,m_strid);
hr=m_Conn?>Execute(_bstr_t(provider),
NULL,?1,NULL);
如果不設定刪除條件,則將POS表中的所有數據全部刪除。
4.3.3 添加記錄
添加記錄與刪除記錄比較類似,也有兩種方法。這里不在詳細闡述。
很多時候,數據庫都會有一個容量,不能無限制的添加記錄,目前比較流行的數據庫容量管理方法是采用先進先出的原則將最舊的記錄刪除,然后添加新數據。如:
varTSQL.bstrVal=SysAllocString(TEXT(\"pos\");
hr=m_Reset?>Open(varTSQL,varConn1,adOpenDynamic,
adLockOptimistic,adCmdTableDiect);
hr=m_Reset?>MoveFirst();
hr=m_Reset?>Delete();
其中Open()函數的最后三個參數必須設置為adOpenDynamic、adLockOptimistic和adCmdTableDiect,這是因為只有動態打開的記錄集才能執行刪除添加記錄操作。
4.3.4 程序運行實例
圖2給出了運用ADOCE技術訪問SQL Server CE 2.0數據庫的應用實例。
4.4 釋放SQL Server CE 2.0數據庫連接
在程序退出時,往往需要釋放數據庫連接和記錄集,防止產生內存泄露。
m_Conn?>Release();
m_Reset?>Release();
5 結 語
基于Windows CE.Net平臺的數據庫應用程序開發已成為開發PDA應用程序的重要部分。專家診斷系統、信息查詢系統、嵌入式GIS系統、手持聽音訓練系統等都涉及到數據庫的操作。本文研究的基于Windows CE.Net系統下通過ADOCE方式訪問SQL Server CE 2.0數據庫的方法,簡單、高效、實用,現已成功應用于某嵌入式定位系統中的衛星定位數據和通信信息數據的管理中,具有很高的實用價值。
參考文獻
[1] 趙勇,董德存.Windows CE下建立數據庫的幾種方法[J].計算機應用與軟件,2005,22(3):48?50.
[2] 陳向群,王雷,馬洪兵.Windows CE.NET系統分析及實驗教程[M].北京:機械工業出版社,2003.
[3] 倪英俊,王命延.嵌入式SQL語句在VC++數據庫系統開發中的技巧[J].科技廣場,2006(11):30?31.
[4] Microsoft. SQL Server 2000 Windows CE edition 2.0 [M/CD]. [2002?02?20]. http://www. msdn.microsoft.com/en.
[5] Anon. Exploring SQL CE 2.0 schema information with the ATL OLE DB consumer templates [EB/OL]. [2005?04?24]. http://www.codeproject.com.
[6] 熊宇昆,邱智亮.Windows CE.net內核定制[J].電子科技,2006(2):60?62.