Windows CE学习之属性数据库(二)

4、          打开数据库

数据库卷挂载之后,在使用数据库之前需要先打开数据库, CEDB 使用 CeOpenDatabaseEx2 函数打开数据库。

HANDLE CeOpenDatabaseEx2( PCEGUID pguid , PCEOID poid ,

  LPWSTR lpszName , SORTORDERSPECEX* psort ,

DWORD dwFlags ,CENOTIFYREQUEST* pRequest );

pguid :数据库卷 GUID

poid :数据库的对象 ID ,数据库卷内唯一,即通过其数据库卷的 ID 和数据库本身的 ID 就可以系统内唯一确定数据库了;打开数据库的方式可以使用对象 ID 的方式,也可以使用数据库名的方式,如果使用对象 ID 的方式,则此处需要填写对象的 ID ,如果使用数据库名的方式打开,传入的参数必须初始化为 0 ,函数成功返回后,将通过本参数传回数据库的对象 ID

lpszName :数据库名, Unicode 字符串,注意,如果传入的对象 ID 不为 0 ,则本参数将被忽略;

psort :索引信息,打开的数据库将按何种方式排序,这将影响后续的顺序访问操作和随机访问函数 CeSeekDatabaseEx 的行为,注意,此处的索引不一定必须是创建时指定的索引,但是索引中的属性信息必须同数据库内的属性相同;

dwFlags :当前指针的行动标志,可以是 CEDB_AUTOINCREMENT 0 ,前者将在使用读函数 CeReadRecordPropsEx 操作数据库之后,操作指针自动前移,这样下次读取时就会读取下一条记录; 0 则表示操作指针不会自动前移,除非使用随机访问函数 CeSeekDatabaseEx

pRequest :注册信息,接受关于数据库的更改信息,由于 CEDB 不支持多用户,此处很少用,待学习;

返回值:数据库句柄,使用完成后需要使用 Closehandle 函数关闭。 INVALID_HANDLE_VALUE 表示打开数据库失败。

5、          关闭数据库

关闭数据库使用 CloseHandle 函数关闭打开数据库时获取的句柄即可。

6、          删除数据库

使用 CeDeleteDatabaseEx 函数删除数据库。

BOOL CeDeleteDatabaseEx( PCEGUID pguid, CEOID oid);

pguid :数据库卷 GUID

oid :数据库对象 ID

注意:删除数据库前必须先关闭数据库。

7、          添加或编辑记录

使用 CeWriteRecordProps 函数向已经打开的数据库中写入记录。

CEOID CeWriteRecordProps(HANDLE hDbase , CEOID oidRecord ,

  WORD cPropID , CEPROPVAL* rgPropVal );

hDbase :数据库句柄,打开数据库函数的返回值;

oidRecord :记录的对象 ID ,记录的 OID 在数据库卷内唯一,用以表示每一条记录,如果传入函数的值为 0 ,则表示是新添加一条记录,否则表示对 OID oidRecord 记录的更新;

cPropID :记录中属性的数量;

rgPropVal :传入函数的记录具体值,是 CEPROPVAL 类型的指针,有效的属性数量是数组的前 cPropID 个。

返回值: 0 表示失败,返回被操作的记录 OID 表示成功。

8、          记录的读取

使用 CeReadRecordPropsEx 函数顺序的从数据库中读取记录。

CEOID CeReadRecordPropsEx( HANDLE hDbase , DWORD dwFlags ,

  LPWORD lpcPropID , CEPROPID* rgPropID , LPBYTE* lplpBuffer ,

  LPDWORD lpcbBuffer ,  HANDLE hHeap );

hDbase :数据库句柄, CeOpenDatabaseEx2 函数的返回值;

dwFlags :返回值内存的处理方案标志, 0 表示全部由调用方负责分配储存返回信息的内存,如果传入的内存过小,则函数调用失败; CEDB_ALLOWREALLOC 表示当调用方分配的函数不够时,本函数将使用 LocalAlloc 函数为返回信息重新分配足够的内存,需要注意的是,这些内存在使用完后需要使用 LocalFree 函数释放掉;

lpcPropID :指定需要读取的属性数量,如果为 null ,则表示返回所有的属性;

rgPropID CEPROPID 类型指针,指定需要返回的属性,如果为 null ,表示返回所有的属性;如果指定,则前 lpcPropID 个属性有效;

lplpBuffer :指向存储返回信息的内存,调用时通常将 dwFlags 函数置为 ALLOWREALLOC ,将本参数置 null ,由本函数负责分配内存,调用方使用完后释放;

lpcbBuffer :返回实际存储在 lplpBuffer 所指向的内存中返回信息的字节数,如果本函数为返回信息分配了内存,则本参数可以用来计算重新分配的内存大小(即本值减去传入内存的大小)

hHeap :指向应用程序堆, ALLOWREALLOC 被设置有效,一般设置为 NULL 即可。

返回值:读取记录的 OID 表示成功, 0 表示失败。

9、          记录随机读取

使用 CeSeekDatabaseEx 函数可以实现对数据库的随机读取。函数 CeReadRecordPropsEx 只能向前移动,不能向后访问。

CEOID CeSeekDatabaseEx(HANDLE hDatabase ,

  DWORD dwSeekType , DWORD dwValue , WORD wNumVals ,

  LPDWORD lpdwIndex );

hDatabase :数据库句柄, CeOpenDatabaseEx2 函数返回值;

dwSeekType :操作指针移动类型, CEDB 中有 8 中移动方式:

CEDB_SEEK_CEOID :查找指定 OID 的记录, dwValue 将传入这一 OID ,这是最有效的查找方式;

CEDB_SEEK_VALUESMALLER :向后查找指定的记录,查找与指定记录最接近的值,即在升序排列中,找出所有小于等于指定值的最大值,在降序排列中,找出所有大于等于指定值的最小值,记录的信息存放在 dwValue 中,以 CEPROPVAL 属性组的方式传入, wNumVals 是属性组的有效属性个数;如果当前操作指针之前没有符合的记录,则返回失败,操作指针停留的数据库的开始处。

CEDB_SEEK_VALUEFIRSTEQUAL :从开始处开始查找,直到找到第一个指定的记录,记录值的传入方式同上所述,当找不到指定值时,操作指针停留在数据库的尾部;

CEDB_SEEK_VALUENEXTEQUAL :从当前位置开始查找指定的值,记录值的传入方式同上所述,操作失败则操作指针停留在数据库的尾部,与 CEDB_SEEK_VALUEFIRSTEQUAL 配合使用可以找出数据库中所有与指定值相同的记录;

CEDB_SEEK_VALUEGREATER :向前查找指定的记录,其他的与 CEDB_SEEK_VALUESMALLER 类似;

CEDB_SEEK_BEGINNING :查找距开始位置 dwValue 距离的位置, dwValue 必须为正;

CEDB_SEEK_CURRENT :查找距当前位置 dwValue 距离的位置, dwValue 为正则顺序查找,为负则逆向查找;

CEDB_SEEK_END :查找距结束位置 dwValue 距离的位置, dwValue 必须为负;这与 EDB 中有所差别, EDB 中必须为正。

dwValue DWORD 类型,根据 dwSeekType 决定数据类型,传入函数需要的相关信息。可能是 CEOID DWORD 计数器或一个 CEPROPVAL 指针;

wNunValue WORD 类型, CEPROPVAL 数据的个数,只有在 dwSeekType CEDB_SEEK_VALUESMALLER, CEDB_SEEK_VALUEGREATER, CEDB_SEEK_VALUEFIRSTEQUAL 时有效;

lpdwIndex LPDWORD 类型,当前位置距数据库开始位置的距离,该参数可以为 NULL ,否则会减低查找的性能,应该尽量避免使用该参数。

返回值: CEOID 类型,当前记录的 OID 0 表示操作失败。

10、          删除记录

使用函数 CeDeleteRecord 删除数据库中的记录。

BOOL CeDeleteRecord(HANDLE hDatabase , CEOID oidRecord );

hDatabase HANDLE 类型,待删除记录所在数据库的句柄,可以使用 CeOpenDatabaseEx2 函数获得该句柄;

oidRecord CEOID 类型,待删除记录的 ID ,可以使用 CeWriteRecordProps 函数获得;

返回值: BOOL 类型, TURE 标示成功删除, false 标示失败;

备注:如果打开数据库时,设置了 CEDB_AUTOINCREAMENT 标记,删除操作成功执行后,数据库读取指针会自动下移一位;如果没有设置该标记,则使用相同数据库句柄的下一个读操作将失败,即数据库读取指针未能更新,从而失效。

11、          获取对象信息

使用函数 CeOidGetInfoEx2 获取对象信息。

BOOL CeOidGetInfoEx2( PCEGUID pceguid , CEOID oid ,

  CEOIDINFOEX* poidInfo );

pceguid PCEGUID 类型,待操作数据库卷的 GUID

oid CEOID 类型,待操作对象的 OID

poidInfo CEOIDINFOEX 类型指针,指向存储返回信息的结构。

返回值: BOOL 类型, TRUE 表示成功, FALSE 表示失败。

12、          通过句柄获取数据库信息

使用函数 CeGetDBInformationByHandle 获取数据库基本信息。

BOOL CeGetDBInformationByHandle(HANDLE hDbase ,

  LPBY_HANDLE_DB_INFORMATION lpDBInfo );

hDbase HANDLE 类型,待操作数据库的句柄;

lpDBInfo LPBY_HANDLE_DB_INFORMATION 类型,指向存储返回信息的结构,需要注意的是,其 wVersion 字段需要初始化为 BY_HANDLE_DB_INFORMATION_VERSION ,即 1 。否则可能会出现无效参数的错误。

返回值:

BOOL 类型,非 0 为成功, 0 为失败;

13、      刷新数据库卷

使用函数 CeFlushDBVol 将缓冲区中的数据写入到永久存储区域。

BOOL CeFlushDBVol( PCEGUID pceguid );

pceguid PCEGUID 类型,指向待操作的数据库卷 GUID ,数据库卷必须已经挂载;当为 NULL 时,系统中所有已挂载的数据库卷将被操作。

返回值: BOOL 类型, TRUE 表示成功, FALSE 表示失败。

备注:对于已经挂载的数据库卷,其所有的操作都会现在缓存中操作。只有系统周期到达、数据满、数据库卷卸载时会自动将缓存中的数据写入永久存储器。否则只有使用本函数显示的刷新缓存。系统重启或掉电,缓存中的数据将丢失。

14、      遍历数据库卷中的数据库

组合使用函数 CeFindFirstDatabaseEx 和函数 CeFindNextDatabaseEx 可以遍历数据库卷中所有的数据库信息。

HANDLE CeFindFirstDatabaseEx( PCEGUID pceguid ,

  DWORD dwDbaseType );

pceguid PCEGUID 类型指针,指定待操作的数据库卷;如果该参数设为 NULL 或指向无效 GUID ,则遍历所有的已挂载数据库卷;

dwDbaseType DWORD 类型,需要遍历的数据库类型,如果设为 0 ,则遍历数据库卷中所有的数据库;

返回值:能够操作获取信息的句柄,如果返回的句柄为 INVALD_HANDLE_VALUE 则表示操作失败。

注意:本函数并不能直接获取数据库的信息,而是返回能够操作这些信息的句柄,具体的信息可以通过 CeFindNextDatabaseEx 函数操作句柄来获取。需要注意的是,操作完成后,必须使用 CloseHandle 关闭本函数返回的句柄,从而释放本函数为存放数据库信息而分配的内存。

可以使用宏 CREATE_SYSTEMGUID 和宏 CREATE_INVALID 来分别获取系统的 GUID 或无效的 GUID

CEOID CeFindNextDatabaseEx( HANDLE hEnum ,

  PCEGUID pceguid );

hEnum HANDLE 类型,自 CeFindDatabaseEx 函数返回的操作数据库基本信息的句柄。

pceguid PCEGUID 类型,返回对应数据库所在的数据库卷的 GUID

返回值: CEOID 类型,数据库的 OID 0 表示操作失败。

备注:通过返回值和参数 pceguid 带回的 GUID 可以唯一标示数据库。

遍历所有的数据库,只需不断调用本函数即可,当返回值为 0 ,错误信息为 ERROR_NO_MORE_ITEMS 时,遍历完所有的数据库。如果在遍历期间,数据库被删除,则会操作失败,并获得 ERROR_KEY_DELETED 的错误,此时,如果需要继续遍历,则必须从头开始,先调用 CeFindFirstDatabaseEx 函数,然会调用本函数。注意,遍历结束后,必须使用 CloseHandle 函数关闭操作句柄,释放相关内存。

15、      列举数据库卷

使用函数 CeEnumDBVolumes 遍历系统中所有已挂载数据库卷。

BOOL CeEnumDBVolumes( PCEGUID pceguid ,

  LPWSTR lpBuf ,DWORD dwNumChars );

pceguid PCEGIUD 类型指针,第一次调用时使用 CREATE_INVALIDGUID 初始化 CEGUID 类型变量,之后使用上一次调用获取的值;

lpBuf LPWSTR 类型,用于返回当前获取的数据库卷的名字;

dwNumChars DWORD 类型,指定 lpBuf 的长度,防止溢出,以字节度量;

返回值: BOOL 类型, TURE 标示成功, FALSE 标示失败。

备注:通过不断的调用本函数可以遍历系统中已经挂载的所有数据库卷信息。首先使用 CREATE_INVALIDGUID 初始化的 CEGUID 类型变量标示遍历开始,成功操作后,系统将第一个已挂载的数据库卷 ID 和名字分别填在 pceguid 参数和 lpBuf 中返回。后续的操作使用前一次调用返回的数据库卷 ID pceguid 参数,从而遍历系统中所有已经挂载的数据库卷。当函数操作失败,错误信息是 ERROR_NO_MORE_ITEMS 时,表示遍历完成。如果错误信息是 ERROE_INSUFFICIENT_BUFFER 时,表示缓冲区不够,重新开辟缓冲区后,继续调用本函数,使用失败调用返回的 CEGUID 变量值重新获取失败的值,从而避免从头开始遍历。

16、      剩余函数

CeChangeDatabaseLCID

CeFreeNotification

CeSetDatabaseInfoEx2

待学习

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值