至从Windows CE1.0发布以来,Windows CE就支持所有的数据库API。在Windows CE2.1,微软推出一套增加了很多额外特性的带Ex扩展的函数,这一变化大大增强了Windows CE数据库的功能。
然而,你也有可能意识到Windows CE数据库API的缺陷。数据库API只支持数据库的继承(层次),这意味着一个表不能继承上一个表,在这一个表中你不能访问上一级表的目录。每一个记录只有一个ID且只能在一个数据库中访问。如果你在这些条条框框中不能开发你的程序,我建议你利用Pocket Access 或 SQL Server来开发你的Windows CE数据库程序。
在Windows CE3.0之前,数据库API局限于只能用4条索引来分类。Windows CE3.0推出以后就上升为8条,利用这8条索引,数据库API能随意地存储数据,并兼容于Windows CE的不同版本。例如,微软利用数据库API来存储一些紧缩列表,e-mail,Pocket PC/Pocket PC 2002上的任务列表。
ADOCE,即微软经过整理后的ADO。程序员可以利用ADOCE来存储数据,这一过程也采用了Pocket Access 或 Microsoft’s SQL Server 2000来实现。ADO和ADOCE通常有相同的记录连接。ADOCE能删除数据库中多余的记录和属性对象。
除了这些性质,还有一个重要特性是ADO和ADOCE的打开,添加和删除记录都非常类似。
为了演示建立数据库的开发过程,我们将编写一例子程序:Movie Tracker数据库,她能够访问影视信息,如影视内容和类级。图A概括了程序中类的继承,并提供了程序的主要框架。请注意程序中的CDatabase 类和 CRecord 类。
Figure A
其中3个属性页是:
CPropPage1:概貌——主要是用作于影视表及其类的查看。用户可以从对话框(如图B)删除相应的记录。
CPropPage2:查看影视内容——用户可以随意向前或向后查看记录(如图C)。
CPropPage3:增加影视内容——用户可以在数据库中增加记录(如图D)。
图 B
图 C
图 D
数据库API包括了Cdatabase类和影视记录结构的Crecord类,图E说明了这一组成。
图 E
利用以上提及的Ex函数,微软提出了卷(volumes)的概念。你可以设置一个数据库的卷。一个卷实质上是定义数据库产生的CreateFile类的特殊版本。
为了建立一个数据库的卷,你可以使用以下的代码片段:
BOOL CeMountDBVol(
PCEGUID pceguid,
LPWSTR lpszDBVol,
DWORD dwFlags );
如果一个打开的卷已经存在,你就可以建立一个数据库:
CEOID CeCreateDatabaseEx(PCEGUID pceguid, CEDBASEINFO * lpCEDBInfo )
CeCreateDatabaseEx提供了以上功能的向导。如图F所示,我们的数据库的卷叫CEDB.clb。卷存放于文件系统中,并带有一个缺省的扩展名CLB。
表 F
名为CEDB的数据库只有一个卷。建立一个数据库后,你还会打开她,以下就是打开数据库的代码片段:
HANDLE CeOpenDatabaseEx(
PCEGUID pceguid,
PCEOID poid,
LPWSTR lpszName,
CEPROPID propid,
DWORD dwFlags,
CENOTIFYREQUEST *pRequest hwndNotify );
Windows CE支持了同时访问数据库的多线程。CENOTIFYREQUEST通过回调函数告诉你在同一时刻的数据库的变化。
打开数据库后,最可取的操作就是定位在数据库的开头以准备作顺序读取,如下面的代码所示:
CEOID CeSeekDatabase(
HANDLE hDatabase,
DWORD dwSeekType,
DWORD dwValue,
LPDWORD lpdwIndex );
CeSeekDatabase函数允许你从数据库的开始,末尾,当前位置来查询。你也可以根据一个记录来查询。数据库API不支持SQL,这样数据库API只能通过CeSeekDatabase函数来查询记录。
CeWriteRecordProps函数增加一条记录到数据库,如以下的代码片段如示:
CEOID CeWriteRecordProps(
HANDLE hDbase,
CEOID oidRecord,
WORD cPropID,
CEPROPVAL * rgPropVal );
你必需补充CEPROPVAL结构中的内容,表A描述了这些合法的数据类型。
表 A
Value |
Description |
CEVT_BLOB |
A CEBLOB structure |
CEVT_BOOL |
A Boolean value |
CEVT_FILETIME |
A FILETIME structure |
CEVT_12 |
A 16-bit signed integer |
CEVT_14 |
A 32-bit signed integer |
CEVT_LPWSTR |
A null-terminated string |
CEVT_R8 |
A 64-bit signed integer |
CEVT_UI2 |
A 16-bit unsigned integer |
CEVT_UI4 |
A 32-bit unsigned integer |
我们的程序在CEDB数据库中存储了以下的内容:
当你要把数据从数据库中读出的时候,首先你必需定位在记录的起始。CeReadRecordPropsEx函数就会把数据读到计算机的内存,你再去访问内存中的数据,这样就会加快你的访问速度。
以下的是CeReadRecordPropsEx函数的说明:
CEOID CeReadRecordPropsEx (
HANDLE hDbase,
DWORD dwFlags,
LPWORD lpcPropID,
CEPROPID * rgPropID,
LPBYTE * lplpBuffer,
LPDWORD lpcbBuffer,
HANDLE hHeap );
通过关闭数据库中的卷就可以关闭数据库,函数CeUnmountDBVol能够完成这一功能,这一函数为如下:
BOOL CeUnmountDBVol (
PCEGUID pceguid );
现在你已经具备了编写一个简单,快捷的Windows CE数据库程序。在下面的章节中,我将讲述如何构建一个ADOCE客户应用程序。