
Windows CE嵌入式高级编程及其实例详解8.doc
89页第 8 章 Windows CE 基础数据库编程在软件编程中,数据库始终是很重要的一个部分通过数据库,可以非常方便地存储和【索数据,极大的提高工作效率例如要实现一个个人通讯簿的管理,就可以使用数据库,它’以非常迅速地实现该项功能在本章中,将重点介绍 Windows CE 自带的数据库系统EDB1 果需要存储的数据量较小,数据结构相对简单,EDB 将会是非常适用的本章主要介绍如下内容:· EDB 概述· EDB 操作综合示例8.1 EDB 概述从 Windows CE 5.0 开始,Windows CE 自带数据库系统就包括了 EDB 和 CEDBCEDB是 Windows CE 5.0 之前就支持的数据库系统,EDB 是 Windows CE 5.0 之后新增的数据库系统EDB 可以理解成是对 CEDB 的升级,新增加了如下功能:· 支持事务处理功能· 使用计划(schemas)定义数据库结构· 增加了字段排序功能(支持最多 l6 个字段排序以及排序字段支持所有字段类型)· 新增了“流”字段类型· 多用户访问在 Windows CE 5.0、Willdows CE 6.0 中依旧支持 CEDB,关于 CEDB 方面的知识读者可以参考《EVC 高级编程以及应用开发》一书。
‘EDB 数据库系统支持 10 种字段数据类型,如表 8.1 所示表 8.110 种字段数据类型表数据类型 描述 对应常量iVal 2个字节有符号整数 CEVT l2uiVU 2个字节无符号整数 CEVT—Ul21Ⅷ 4个字节有符号整数 CEVT l4ulV.al 4个字节无符号整数 CEVT-_U14filetime 日期时间结构 CEVl jILETIMElpwstr 以0结构的UNICODE字符串 CEV£LPWSTRblob CEBLOB结构,用于存储一些较小的二进制数据 CEVT—.BLOBBoolVal 布尔值 CEVT—.BOOLdblVal 8个字节的有符号值 CEVT—.R8Stream 内存流 CEVT—.STREAM 256 Windows CE 嵌入式高级编程及其实例详解(用 C++实现)本节将来介绍 EDB 的一些重要 APl 函数,这些 APl 函数可以实现创建数据库、打开数损库以及读写记录等功能8.1.1 装配数据卷从 Windows CE 2.1 开始,数据库文件可以存储在卷中而不用直接存储在对象存储库中数据库卷是可以存储 Windows CE 数据库的特殊格式的文件。
在 Windows CE 中,如果想把参据库存储在文件中,即要使用数据库卷,就必须先装配数据库卷,并且在关闭数据库后,还矗卸载数据库卷装配数据库卷具有两个意思,一是新建数据库卷,二是打开已存在的数据库卷在 Windows CE 中装配数据库卷可以通过 CeMountDBVolEx 函数来实现,它的定义如下:传常BOOL CeMountDBVolEx(PCEGUID pGuid,LPWSTR lpwszDBVol,CEVOLUMEOPTIONS+pOptions,值 描述CREATE——NEW 创建一个新的数据库卷,如果数据库卷已存在,函数将失败CREATE——ALWAYS 创建一个新的数据库卷,如果数据库卷已存在,它将覆盖旧卷OPEN——EXISTING 打开一个数据库卷,如果数据库卷不存在,函数将失败OPEN——ALWAYS 打开一个数据库卷,如果数据库卷不存在,则创建一个新的数据库卷TRUNCATE——EXISTING打开一个数据库卷,并将其截断为0字节大小如果数据库卷不存在,函数将失败如果函数执行成功,将返回TRUE,还会将参数pGuid设置为某一个值,并且此值可E差给其他数据库函数使用。
如果函数执行失败,则可以调用GetLastError函数获取错误代见的错误代码如表8.3所示表8-3常见错误代码袭值 描述ERROR_INVALID_PARAMETER 表示其中某个参数无效ERROR——BAD——FORMAT 表示数据库卷来自一个不同的EDB版本ERROR——FILE.—NOT FOUND表示参数dwFlags值为TRUNCATE_EXISTING,但是要装载的数据库卷不存在 翠型荡目勘茸犁簿鞣‘轴SAVA~3V-3J:vauD蕈S天VMlv_N丑d0暮蔡s翱I舭p鞣霉乐些辈鞍貊回娶骠豳S工SIXa_凡QvⅡⅪlv—H0ⅪⅦ日驰卫业哥pJoMs∞dzsMd1M曾搿争8擎}》 号爵明士9-8擎椠哥碓‘翠斟茸瓣犁群s8BId角M觚秘车 ·} 9 I)d嗍dlxosⅪ,旷Ⅱ31bs K耳¥咨‘磉妙朝猪专茸擗犁群sdoMumNA~猪专 ·p 乙椠蓦蔡蟛硒‘卓硎鞘瞬勒当擎Uo!sa0AA~硝右 ·! jx丑3丑dsH丑QHol工-Hosd牛 -x丑3丑dsH丑aH0.I-Hos {B} j[doHdlLHosxⅥprga丑3】s6PTdMp6J GHOMG} ?[d。
Hd工HosxVpr日Q丑a工doJd6】 GIdOHd丑D} ?paA】aseHM GHOM5¨} :s6它.[d五exM aⅪOM} !sdoxdmnNM GHOM±£ !uTSXaAM GHOM} } x丑3丑dsH丑a丑工Hos一%0na%s ;apd五3} :土蝉百晕璐骅窃鎏《t#噼羁Ⅻ3丑dsⅪa①Iol工Ⅺ0s叫群Vosd摹华髫揩朝婆呆茸群磉革群VoSd壕霉 ·1 蜘彩骥徘OUmNZsA~dI}臻霉眵烂·0椠业鹭p!od嫌霉酱晦牲零犁群鞣明妊群联益当擎otuBNz8柚骠霉 ·1 七b p!od翠黝掣琳碘斟誓艋犁群骠明回娶‘掣辫骠妊群半}p.mod咄OlLmNZSA~dl群诽琳‘0紧暮蔡p!od浓辫誓胚茸辨壕朗妊群些擎p!od臻霉 ·} QIn0明捌群磉些擎p!nod壕霉 ·}0 崾勘i6^bK‘4¨o!ssososeqtnefImOOO1岩疆(HOH)uo!ssosmBoaO00甲血耳鎏铧呜弩艇娶号当擎uo!ssosq骠霉 ·l !(} 一^ ’……Ⅱ一十mⅢM…Ⅱ…~0IIoN丑3}} 。
SSWldMP GHOMO} ,4】sd早x丑3ad sH丑QH0工Hos} OmeNz sMdI HlLsMdql 续表值 描述CEDB——SORT——IGNORENONSPACE 仅对字符串有效CEDB——SORT——IGNORESYMBOLS 仅对字符串有效CEDB——SORT——IGNOREKANATYPE 不区分Hiragana和Katakana字符仅对字符串有效CEDB——SORT——IGNOREWIDTH 不区分单字节和双字节,只对字符串有效CEDB——SORT——NONNULL 表示排序字段不能为NULLDWORD dwSizeDWORD 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取值表值 描述DB..CEOID_CREATED 创建了一个新的数据库对象DB——CEOID——DATABASE——DELETED 数据库从数据卷中删除DB——CEOID——RECORD——DELETED 记录从数据库中删除DB——CEOID——FILE——DELETED 文件被删除DB——CEOID——DIRECTORY——DELETED 目录被删除DB_CEOID_CHANGED 数据库对象被修改 , · 参数 hSession 表示会话对象句柄,此参数可以在打开数据库函数(CeOpenDatabaselnSession)中获取此参数与对应的 CeBeginTransaction 函数中的hSession 值是一样的· 参数 fCommit 表示结束一个事务的两种方法,一种是提交事务,把之前的操作全部更新到数据库,另一种是回滚事务,把之前的操作全部取消参数 fCommit 值为TRUE,则提交事务,否则回滚事务当 fCommit 值为 TRUE 时,所有的数据变化并不会实际写入到磁盘,此时我们还需调用 CeFlushDBVol 函数将数据写入磁盘。
若成功结束事务,函数返回 TRUE,否则返回 FALSE8.1.7 删除数据库EDB 提供了 CeDeleteDatabase 函数来删除数据库卷中的数据库,包括删除数据库中的记录该函数定义如下:BOOL CeDeleteDatabase( 264 window!cE 嵌入式高级编程及其实例详解(用 c++实现)———————————————————————_——————————————————————————————————一PCEGUID pGuid,CEOID Oid1;· 参数 p 伽 d 表示要删除的数据库所在的数据库卷标识,可由 CeMountDbVolEx 函数获取·参数 oid 表示要删除的数据库对象标识;0id 值必须已经被 CeCrea 卸撕 base 晰吐证’mI)s@DB:函数生成成功删除数据库后将返回 TRUE,否则返回 FALSE同样的,可以使用 GetLastError 函数获取函数执行错误信息8.1.8 枚举数据库卷以及数据库 如果需要了解当前系统中已装配好的数据卷的信息,可以通过重复调厍CeEnumDBVolumes 函数来实现CeEnumDBVolumes 函数的定义如下:BOOL CeEnumDBVo lume s(PCEGUID pGuid,LPWSTR pws zName,DWORD cchMaxName1: -· 参数 pGuid 用于标识开始列举的数据库卷 guid。
在首次使用时,应该调月CREATE INVALIDEDBGUID 宏将 pGuid 设置为无效,然后在下一次调用时,直招调用上一次的 pGuid 即可,直到函数返回 FALSE 值,调用 GetLastError 函数返匡ERROR—N0—MORE—ITEMS· 参数 pwszName 用于存储找到的数据库卷名称· 参数 cchMaxName 表示 pwszName 的长度此值应设置足够大,以便能够存 l;pwszName 值,此值至少应该设置为 CEDB_MAXDBASENAMELEN如果函数找到一个已装配的数据库卷,将返回 TRUE 值,并且将数据库卷的标识和名乖分别存储到 pGuid 和 pwszName 中;反之,则返回 FALSE 值如下代码实现了列举系统中所有已装配的数据库卷的功能:CEGUID ceguid;TCHAR szvolumeName[CEDB_MAXDBASENAMELEN];//创建无效的 GUIDCREATE—INVALIDEDBGU 工 D(&ceguid);//列举已装载的数据库卷while(CeEnumDBVolumes(&ceguid,szVolumeName,sizeof(szVolumeName))){TRACE fL”Enum mounted volumes:%s\n” ,szVolumeName)j}上面介绍了 EDB 列举已经装载。
