第8章WindowsCE基础数据库编程.pdf
《第8章WindowsCE基础数据库编程.pdf》由会员分享,可在线阅读,更多相关《第8章WindowsCE基础数据库编程.pdf(88页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第 8 章 Windows CE基础数据库编程 在软件编程中,数据库始终是很重要的一个部分。通过数据库,可以非常方便地存储和【索数据,极大的提高工作效率。例如要实现一个个人通讯簿的管理,就可以使用数据库,它 以非常迅速地实现该项功能。在本章中,将重点介绍 Windows CE 自带的数据库系统 EDB。1 果需要存储的数据量较小,数据结构相对简单,EDB 将会是非常适用的。本章主要介绍如下内容:EDB 概述 EDB 操作综合示例 8 1 EDB 概述 从 Windows CE 50 开始,Windows CE自带数据库系统就包括了 EDB 和 CEDB。CEDB 是 Windows CE 50
2、 之前就支持的数据库系统,EDB 是 Windows CE 50 之后新增的数据库系统。EDB 可以理解成是对 CEDB 的升级,新增加了如下功能:支持事务处理功能。使用计划(schemas)定义数据库结构。增加了字段排序功能(支持最多 l6 个字段排序以及排序字段支持所有字段类型)。新增了“流”字段类型。多用户访问。在 Windows CE 50、Willdows CE 60 中依旧支持 CEDB,关于 CEDB 方面的知识读者可 以参考EVC 高级编程以及应用开发一书。EDB 数据库系统支持 10 种字段数据类型,如表 8 1 所示。表 8 110 种字段数据类型表 数据类型 描述 对应常
3、量 iVal 2 个字节有符号整数 CEVT l2 uiVU 2 个字节无符号整数 CEVTUl2 1 4 个字节有符号整数 CEVT l4 ulVal 4 个字节无符号整数 CEVT-_U14 filetime 日期时间结构 CEVl jILETIME lpwstr 以0 结构的UNICODE字符串 CEVLPWSTR blob CEBLOB结构,用于存储一些较小的二进制数据 CEVTBLOB BoolVal 布尔值 CEVTBOOL dblVal 8 个字节的有符号值 CEVTR8 Stream 内存流 CEVTSTREAM 256 Windows CE 嵌入式高级编程及其实例详解(用 C
4、+实现)本节将来介绍EDB 的一些重要APl 函数,这些APl 函数可以实现创建数据库、打开数损 库以及读写记录等功能。8 1 1 装配数据卷 从 Windows CE 2 1 开始,数据库文件可以存储在卷中而不用直接存储在对象存储库中。数据库卷是可以存储Windows CE 数据库的特殊格式的文件。在Windows CE 中,如果想把参 据库存储在文件中,即要使用数据库卷,就必须先装配数据库卷,并且在关闭数据库后,还矗 卸载数据库卷。装配数据库卷具有两个意思,一是新建数据库卷,二是打开已存在的数据库卷 在 Windows CE 中装配数据库卷可以通过CeMountDBVolEx 函数来实现,
5、它的定义如下:传 常 BOOL CeMountDBVolEx(PCEGUID pGuid,LPWSTR lpwszDBVol,CEVOLUMEOPTIONS+pOptions,值 描述 CREATENEW 创建一个新的数据库卷,如果数据库卷已存在,函数将失败 CREATEALWAYS 创建一个新的数据库卷,如果数据库卷已存在,它将覆盖旧卷 OPENEXISTING 打开一个数据库卷,如果数据库卷不存在,函数将失败 OPENALWAYS 打开一个数据库卷,如果数据库卷不存在,则创建一个新的数据库卷 TRUNCATEEXISTING 打开一个数据库卷,并将其截断为0 字节大小。如果数据库卷不存在,
6、函数将失败 如果函数执行成功,将返回TRUE,还会将参数pGuid设置为某一个值,并且此值可E 差给其他数据库函数使用。如果函数执行失败,则可以调用GetLastError函数获取错误代 见的错误代码如表8.3所示。表8-3常见错误代码袭 值 描述 ERROR_INVALID_PARAMETER 表示其中某个参数无效 ERRORBADFORMAT 表示数据库卷来自一个不同的EDB版本 ERRORFILENOT FOUND 表示参数dwFlags值为TRUNCATE_EXISTING,但是要装载 的数据库卷不存在 翠型荡目勘茸犁簿鞣轴SAVA3V-3J:vauD蕈S 天VMlv_N丑d0暮蔡s
7、翱I 舭p 鞣霉乐些辈 鞍貊回娶骠豳 S工SIXa_凡QvlvH0日 驰卫业哥pJoMsdzsMd1M曾搿争8 擎 。号爵明士9-8擎椠哥碓翠斟茸瓣犁群s8BId角M 觚秘车 。(9 I)d嗍dlxos,旷31bs K耳¥咨磉妙朝猪专茸擗犁群sdoMumNA猪专 p 。乙椠蓦蔡蟛硒卓硎鞘瞬勒当擎Uo!sa0AA硝右 !jx丑3 丑dsH丑QHol工-Hosd牛 -x丑3 丑dsH丑aH0I-Hos B jdoHdlLHosxprga丑3】s6PTdMp6J GHOMG?d。Hd工HosxVpr日Q 丑。】a 工doJd6】GIdOHd丑D?paA】aseHM GHOM 5 :s6它d五exM
8、aOM !sdoxdmnNM GHOM !u。TSXaAM GHOM x丑3 丑dsH丑a 丑。工Hos一0nas ;ap。d 五3 :土蝉百晕璐骅窃鎏 t#噼羁3 丑dsa Iol工0s叫群Vosd。摹华髫揩朝婆呆茸群磉革群VoSd壕霉 1 。蜘彩骥徘OUmNZsAdI 臻霉眵烂0 椠业鹭p!od嫌霉酱晦。牲零犁群鞣明妊群联益当擎otuBNz8柚骠霉 1 。七b p!od翠黝掣琳碘斟誓艋犁群骠明回娶掣辫骠妊群半 pmod咄OlLmNZSAdl群诽琳0 紧暮蔡p!od。浓辫誓胚茸辨壕朗妊群些擎p!od臻霉 。QIn0明捌群磉些擎p!nod壕霉 0 。崾勘i6bK4 o!ssososeqtnef
9、ImOOO 1 岩疆(HOH)uo!ssosmBoaO00甲血耳鎏。铧呜弩艇娶号当擎uo!ssosq骠霉 l !(一 一十m M 0IIoN丑3 。SSWldMP GHOMO ,4】。sd早x 丑3ad sH丑QH0工Hos 。OmeNz sMdI HlLsMdq l 续表 值 描述 CEDBSORTIGNORENONSPACE 仅对字符串有效 CEDBSORTIGNORESYMBOLS 仅对字符串有效 CEDBSORTIGNOREKANATYPE 不区分Hiragana和Katakana字符。仅对字符串有效 CEDBSORTIGNOREWIDTH 不区分单字节和双字节,只对字符串有效 CED
10、BSORTNONNULL 表示排序字段不能为NULL DWORD dwSize DWORD dwParam;UINT uType;CEGUI D guid;CEOID oid;CEOID oidParent;CENOTINOTIFICATION;字段 dwSize表示 CENOTIFICATION结构大小。字段 dwParam存储在 CENOTIFYREQUEST结构中的 dwParam成员值。字段 uType表示发送 WM_DBNOTIFICATION消息的类型,它可以设置为表 8 8 中的 任意值。262 Windows CE嵌入式高级编程及其实例详解(用c+实现)表8 8 成员uType
11、取值表 值 描述 DBCEOID_CREATED 创建了一个新的数据库对象 DBCEOIDDATABASEDELETED 数据库从数据卷中删除 DBCEOIDRECORDDELETED 记录从数据库中删除 DBCEOIDFILEDELETED 文件被删除 DBCEOIDDIRECTORYDELETED 目录被删除 DB_CEOID_CHANGED 数据库对象被修改 ,参数 hSession表示会话对象句柄,此参数可以在打开数据库函数 (CeOpenDatabaselnSession)中获取。此参数与对应的 CeBeginTransaction函数中的 hSession值是一样的。参数 fCom
12、mit表示结束一个事务的两种方法,一种是提交事务,把之前的操作全部 更新到数据库,另一种是回滚事务,把之前的操作全部取消。参数 fCommit值为 TRUE,则提交事务,否则回滚事务。当 fCommit值为 TRUE时,所有的数据变化并 不会实际写入到磁盘,此时我们还需调用 CeFlushDBVol函数将数据写入磁盘。若成功结束事务,函数返回 TRUE,否则返回 FALSE。8 1 7 删除数据库 EDB提供了 CeDeleteDatabase函数来删除数据库卷中的数据库,包括删除数据库中的记录。该函数定义如下:BOOL CeDeleteDatabase(264 window!cE嵌入式高级编
13、程及其实例详解(用 c+实现)_。一 PCEGUID pGuid,CEOID Oid 1;参数 p 伽 d 表示要删除的数据库所在的数据库卷标识,可由 CeMountDbVolEx函数获取。参数 oid表示要删除的数据库对象标识;0id 值必须已经被 CeCrea 卸撕 base 晰吐证mI)sDB:函数生成。成功删除数据库后将返回 TRUE,否则返回 FALSE。同样的,可以使用 GetLastError函数 获取函数执行错误信息。8 1 8 枚举数据库卷以及数据库 。如果需要了解当前系统中已装配好的数据卷的信息,可以通过重复调厍 CeEnumDBVolumes 函数来实现。CeEnumDB
14、Volumes 函数的定义如下:BOOL CeEnumDBVo lume s(PCEGUID pGuid,LPWSTR pws zName,DWORD cchMaxName 1:-参数 pGuid用于标识开始列举的数据库卷 guid。在首次使用时,应该调月 CREATE INVALIDEDBGUID宏将 pGuid设置为无效,然后在下一次调用时,直招 调用上一次的 pGuid即可,直到函数返回 FALSE 值,调用 GetLastError函数返匡 ERROR N0MOREITEMS。参数 pwszName用于存储找到的数据库卷名称。参数 cchMaxName表示 pwszName的长度。此值
15、应设置足够大,以便能够存 l;pwszName值,此值至少应该设置为 CEDB_MAXDBASENAMELEN。如果函数找到一个已装配的数据库卷,将返回 TRUE 值,并且将数据库卷的标识和名乖 分别存储到 pGuid和 pwszName中;反之,则返回 FALSE 值。如下代码实现了列举系统中所有已装配的数据库卷的功能:CEGUID ceguid;TCHAR szvolumeNameCEDB_MAXDBASENAMELEN;创建无效的 GUID CREATEINVALIDEDBGU工 D(&ceguid);列举已装载的数据库卷 while(CeEnumDBVolumes(&ceguid,sz
16、VolumeName,sizeof(szVolumeName)TRACE fL”Enum mounted volumes:sn”,szVolumeName)j 上面介绍了 EDB 列举已经装载的数据库卷的函数,EDB 也提供了一套 APl 函数来列举;据库卷中的数据库,CeFindFirstDatabaseEx用于查找第一个数据库并获取一个查找句柄,然 J 传递给 CeFindNextDatabaseEx函数以继续查找数据库。此 APl函数非常类似于文件查找,一 不过 CeFindFirstDatabaseEx函数只是进行搜索,并不返回数据库对象。CeFindFirstDatabaseEx函数
17、的定义如下:HANDLE CeFindFirstDatabaseEx(retUrn;开始枚举数据库 while(CeOid=CeFindNextDatabaseEx(hEnumDB,NULL)!。0)ZeroMemory(&CeObjectInf0,sizeof(CeObjectInfo);CeObj ectInf0wVersion=2;得到数据库信息 if(!CeOidGetInfoEx2(pGuid,CeOid,&CeObj ectInfo)dwError=GetLastError()j TRACE(L-the last error:dn”,dwError)j 关闭查找旬柄 C10SeHa
18、ndle(hEnumDB);e1Se retUrnj 判断是数据库类型 if(CeObjectInf0wObjType=OBJTYPEDATABASE)TRACE fL”The name of the database is:sn”,CeObjectInf0infDatabaseszDbaseName);)关闭查找句柄 CIoseHandle(hEnumDB);枚举系统的所有已经装载的数据库卷以及数据库卷中的数据库 void CEDBSampleDl9:0nBnClickedBtnEnumVolumes()CEGUID ceguid;TCHAR szVolumeNameCEDB_MAXDBAS
19、ENAMELEN;创建无效的 GUID CREATEINVAL工 DEDBGU工 D(&ceguid);列举已装载的数据库卷 while(CeEnumDBVolumes(&ceguid,SzVolumeName,CEDBMAXDBASENAMELEN一 1)TRACE fL”Enum mounted volumes:S n”,SzVolumeName);ZeroMemory(szVolumeName,CEDB_MAXDBASENAMELEN+2);列举其中的数据库 EnumDatabasesInVolume(&ceguid);)+7 8.1.9查找或移动记录 打开数据库后,如果想读取或写入记录
20、,还必须移动数据库的当前指针。EDB提供了 CeSeekDatabaseEx函数来查找数据库或移动数据库指针,该函数在查找记录的同时,还设置 了数据库的当前指针。CeSeekDatabaseEx函数如果查找到了御应的记录,则返回此记录对象 标识,否则返回0 值。0 CeSeekDatabaseEx函数的定义如下:CEOID CeSeekDatabaseEx(。HANDLE hDatabase,i DWORD dwSeekType,DWORD dwValue,WORD wNumValS,LPDWORD ipdwIndex );参数hDatabase:表示打开的数据库句柄。参数dwSeekType
21、表示查找记录的类型。dwSeekType参数的取值如表8-9所示。表8-9 dwSeekType参数取值表 值 描述 CEDBSEEK_CEOID 根据特定记录对象ID来查找记录 CEDBSEEKVALUESMALLER 从数据库当前位置开始查找,直到找到的记录小于所指定 的值 CEDBSEEK_VALUESMALLEROREQUAL 从数据库当前位置开始查找,直到找到的记录小于或者等于 所指定的值 CEDBSEEK_VALUEFIRSTEQUAL 从数据库当前位置开始查找,直到找到的记录与所指定的值 相等。如果没有找到,数据库当前指针将移动数据库尾部,函数并返回0。指定的值由CEPROPVA
22、L结构数组存储,参 数dwValue指向此结构地址,wNumVals表示数组个数 CEDBSEEK_VALUENEXTEQUAL 从数据库当前位置开始查找,直到找到的记录等于所指定的 值。指定的值由CEPROPVAL结构数组存储,参数dwValue 指向此结构地址 CEDBSEEKVALUEGREATER 从数据库当前记录开始查找,直到找到的记录属性值大于所 指定的值。指定的值由CEPROPVAL结构数组存储,参数 dwValue指向此结构地址 CEDBSEEK_VALUEGREATEROREQUAL 从数据库当前记录开始查找,直到找到的记录属性值大于或 等于所指定的值。指定的值由CEPROP
23、VAL结构数组存储,参数dwValue指向此结构地址 CEDBSEEKBEGINNING 从数据库记录首部开始查找第n 个记录,n 的值由dwValue 决定 值 描述 CEDBSEEKCURRENT 从数据库当前记录开始向前或向后查找第n 个记录。n 的值 由dwValue参数决定,如果是正数则从当前记录开始向后查 找第n 个记录,如果为负数,则从当前记录开始向前查找第 n 个记录 CEDBSEEK_END 从数据库记录末尾开始查找倒数第n 个记录,n 的值由 dwValue决定 CEDBSEEKPREFIX 支持按前缀进行查询。此标志只能和strin9、BLOB字段使 用。例如:要查找字段
24、中前缀为“AAA”字符,那么字段中 的值为“AAAA”、“AAABC”将被列举出来,但是值为“从”或者“AAB”将不会被查找。此标志还必须和以前的查找类型组合使用:CEDB SEEK VALUEFIRSTEQUAL CEDB SEEK VALUESMALLER CEDB SEEK、,ALUEGREATER CEDB SEEK VALUESMALLEROREQUAL CEDB SEEK VALUEGREATEROREQUAL 使用下面的标志,前缀可以忽略事件:NORM IGNORECASE NORM IGNORENONSPACE NORMIGNOREKANATYPE NORM IGNOREWID
25、TH 在dwSeekType参数取值的描述中,多次提到了CEPROPVAL结构,以下是该结构的定支 说明:typedef structCEPROPVAL CEPROPID propid;WORD wLenDataj ,WORD wFlags;CEVALUNION val;)CEPROPVAL;typedef CEPROPVAL+PCEPROPVALj 字段propid表示字段标识。字段wLenData将被忽略,未被使用。字段wFlags表示字段属性。在CeSeekDatabase函数中,可以忽略。字段val是一个联合结构,在实际使用时,应当根据字段的类型选用相应的赋值。尹 中CEVALUNIO
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- WindowsCE 基础 数据库 编程
限制150内