如何编写一个Windows CE的数据库程序

ZDNet软件频道 时间:2005-06-06 作者: |  我要评论()
本文关键词:wince
在这一章节里,我将讲述关于编写Windows CE设备上的数据库程序的基础知识。
正当计算机技术在当前信息时代日新月异发展之时,程序员开发的程序也力求追求满足新型设备的需要。这一过程最大的挑战就是要为每一个设备单元建立一个相应的数据库。在这一章节里,我将讲述关于编写Windows CE设备上的数据库程序的基础知识。



复习一下前几节的内容
如果你是Windows CE的新手,你最好先读一下我们讲述过的前几节的内容。
Windows CE开发初步
如何编写Windows CE结构的应用程序
数据库API

至从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

ADOCE,即微软经过整理后的ADO。程序员可以利用ADOCE来存储数据,这一过程也采用了Pocket Access 或 Microsoft’s SQL Server 2000来实现。ADO和ADOCE通常有相同的记录连接。ADOCE能删除数据库中多余的记录和属性对象。

除了这些性质,还有一个重要特性是ADO和ADOCE的打开,添加和删除记录都非常类似。




一个例程:Movie Tracker数据库

为了演示建立数据库的开发过程,我们将编写一例子程序:Movie Tracker数据库,她能够访问影视信息,如影视内容和类级。图A概括了程序中类的继承,并提供了程序的主要框架。请注意程序中的CDatabase 类和 CRecord 类。

Figure A

点击放大

Class inheritance hierarchy

其中3个属性页是:

CPropPage1:概貌——主要是用作于影视表及其类的查看。用户可以从对话框(如图B)删除相应的记录。

CPropPage2:查看影视内容——用户可以随意向前或向后查看记录(如图C)。

CPropPage3:增加影视内容——用户可以在数据库中增加记录(如图D)。

图 B

Deleting a record from the database

图 C

Viewing movies

图 D

Adding a movie to the database


数据库API包括了Cdatabase类和影视记录结构的Crecord类,图E说明了这一组成。

图 E

点击放大

Class association and composition

打开数据库

利用以上提及的Ex函数,微软提出了卷(volumes)的概念。你可以设置一个数据库的卷。一个卷实质上是定义数据库产生的CreateFile类的特殊版本。

为了建立一个数据库的卷,你可以使用以下的代码片段:

BOOL CeMountDBVol(
PCEGUID pceguid,
LPWSTR lpszDBVol,
DWORD dwFlags );

如果一个打开的卷已经存在,你就可以建立一个数据库:

CEOID CeCreateDatabaseEx(PCEGUID pceguid, CEDBASEINFO * lpCEDBInfo )

CeCreateDatabaseEx提供了以上功能的向导。如图F所示,我们的数据库的卷叫CEDB.clb。卷存放于文件系统中,并带有一个缺省的扩展名CLB。

表 F

点击放大

Database volume

名为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函数来查询记录。



获得代码
你可以download这些源代码来运行你的仿真器或PDA上。

添加内容到数据库

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数据库中存储了以下的内容:

  • strTitle—256-character Unicode string
  • nHour—short int
  • nMinute—short int
  • nRating—float
  • strDescription—1,024-character Unicode string
从数据库中读取内容

当你要把数据从数据库中读出的时候,首先你必需定位在记录的起始。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客户应用程序。



责任编辑:李宁

欢迎投稿

百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134