WindowsCE嵌入式高级编程及其实例详解8.doc_第1页
WindowsCE嵌入式高级编程及其实例详解8.doc_第2页
WindowsCE嵌入式高级编程及其实例详解8.doc_第3页
WindowsCE嵌入式高级编程及其实例详解8.doc_第4页
WindowsCE嵌入式高级编程及其实例详解8.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章Windows CE基础数据库编程 在软件编程中,数据库始终是很重要的一个部分。通过数据库,可以非常方便地存储和【索数据,极大的提高工作效率。例如要实现一个个人通讯簿的管理,就可以使用数据库,它以非常迅速地实现该项功能。在本章中,将重点介绍Windows CE自带的数据库系统EDB。1果需要存储的数据量较小,数据结构相对简单,EDB将会是非常适用的。 本章主要介绍如下内容: EDB概述 EDB操作综合示例81 EDB概述 从Windows CE 50开始,Windows CE自带数据库系统就包括了EDB和CEDB。CEDB是Windows CE 50之前就支持的数据库系统,EDB是Windows CE 50之后新增的数据库系统。EDB可以理解成是对CEDB的升级,新增加了如下功能: 支持事务处理功能。 使用计划(schemas)定义数据库结构。 增加了字段排序功能(支持最多l6个字段排序以及排序字段支持所有字段类型)。 新增了“流”字段类型。 多用户访问。 在Windows CE 50、Willdows CE 60中依旧支持CEDB,关于CEDB方面的知识读者可以参考EVC高级编程以及应用开发一书。 EDB数据库系统支持10种字段数据类型,如表81所示。 表8110种字段数据类型表 数据类型 描述 对应常量iVal 2个字节有符号整数CEVT l2 uiVU 2个字节无符号整数CEVTUl2 14个字节有符号整数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+实现) 本节将来介绍EDB的一些重要APl函数,这些APl函数可以实现创建数据库、打开数损库以及读写记录等功能。 811装配数据卷 从Windows CE 21开始,数据库文件可以存储在卷中而不用直接存储在对象存储库中。数据库卷是可以存储Windows CE数据库的特殊格式的文件。在Windows CE中,如果想把参据库存储在文件中,即要使用数据库卷,就必须先装配数据库卷,并且在关闭数据库后,还矗卸载数据库卷。装配数据库卷具有两个意思,一是新建数据库卷,二是打开已存在的数据库卷在Windows CE中装配数据库卷可以通过CeMountDBVolEx函数来实现,它的定义如下:传常BOOL CeMountDBVolEx( PCEGUID pGuid, LPWSTR lpwszDBVol,CEVOLUMEOPTIONS+pOptions, 值 描述CREATENEW创建一个新的数据库卷,如果数据库卷已存在,函数将失败CREATEALWAYS创建一个新的数据库卷,如果数据库卷已存在,它将覆盖旧卷OPENEXISTING打开一个数据库卷,如果数据库卷不存在,函数将失败OPENALWAYS打开一个数据库卷,如果数据库卷不存在,则创建一个新的数据库卷TRUNCATEEXISTING打开一个数据库卷,并将其截断为0字节大小。如果数据库卷不存在,函数将失败如果函数执行成功,将返回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翱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 GHOM5 :s6它d五exM aOM !sdoxdmnNM GHOM !u。TSXaAM GHOM x丑3丑dsH丑a丑。工Hos一0nas ;ap。d五3 :土蝉百晕璐骅窃鎏t#噼羁3丑dsaIol工0s叫群Vosd。摹华髫揩朝婆呆茸群磉革群VoSd壕霉 1 。蜘彩骥徘OUmNZsAdI臻霉眵烂0椠业鹭p!od嫌霉酱晦。牲零犁群鞣明妊群联益当擎otuBNz8柚骠霉 1 。七b p!od翠黝掣琳碘斟誓艋犁群骠明回娶掣辫骠妊群半pmod咄OlLmNZSAdl群诽琳0紧暮蔡p!od。浓辫誓胚茸辨壕朗妊群些擎p!od臻霉 。QIn0明捌群磉些擎p!nod壕霉 0 。崾勘i6bK4o!ssososeqtnefImOOO1岩疆(HOH)uo!ssosmBoaO00甲血耳鎏。铧呜弩艇娶号当擎uo!ssosq骠霉 l !( 一 一十mM0IIoN丑3 。SSWldMP GHOMO ,4】。sd早x丑3ad sH丑QH0工Hos 。OmeNz sMdI HlLsMdql 续表 值 描述CEDBSORTIGNORENONSPACE仅对字符串有效CEDBSORTIGNORESYMBOLS仅对字符串有效CEDBSORTIGNOREKANATYPE不区分Hiragana和Katakana字符。仅对字符串有效CEDBSORTIGNOREWIDTH不区分单字节和双字节,只对字符串有效CEDBSORTNONNULL表示排序字段不能为NULL DWORD dwSize DWORD dwParam; UINT uType; CEGUI D guid; CEOID oid; CEOID oidParent;CENOTINOTIFICATION; 字段dwSize表示CENOTIFICATION结构大小。 字段dwParam存储在CENOTIFYREQUEST结构中的dwParam成员值。 字段uType表示发送WM_DBNOTIFICATION消息的类型,它可以设置为表88中的 任意值。262 Windows CE嵌入式高级编程及其实例详解(用c+实现) 表88成员uType取值表 值 描述DBCEOID_CREATED创建了一个新的数据库对象DBCEOIDDATABASEDELETED数据库从数据卷中删除DBCEOIDRECORDDELETED记录从数据库中删除DBCEOIDFILEDELETED文件被删除DBCEOIDDIRECTORYDELETED目录被删除DB_CEOID_CHANGED数据库对象被修改 , 参数hSession表示会话对象句柄,此参数可以在打开数据库函数 (CeOpenDatabaselnSession)中获取。此参数与对应的CeBeginTransaction函数中的 hSession值是一样的。 参数fCommit表示结束一个事务的两种方法,一种是提交事务,把之前的操作全部 更新到数据库,另一种是回滚事务,把之前的操作全部取消。参数fCommit值为 TRUE,则提交事务,否则回滚事务。当fCommit值为TRUE时,所有的数据变化并 不会实际写入到磁盘,此时我们还需调用CeFlushDBVol函数将数据写入磁盘。 若成功结束事务,函数返回TRUE,否则返回FALSE。 817删除数据库 EDB提供了CeDeleteDatabase函数来删除数据库卷中的数据库,包括删除数据库中的记录。该函数定义如下: BOOL CeDeleteDatabase( 264 window!cE嵌入式高级编程及其实例详解(用c+实现)_。一 PCEGUID pGuid, CEOID Oid 1; 参数p伽d表示要删除的数据库所在的数据库卷标识,可由CeMountDbVolEx函数获取。 参数oid表示要删除的数据库对象标识;0id值必须已经被CeCrea卸撕base晰吐证mI)sDB: 函数生成。 成功删除数据库后将返回TRUE,否则返回FALSE。同样的,可以使用GetLastError函数获取函数执行错误信息。 818枚举数据库卷以及数据库 。 如果需要了解当前系统中已装配好的数据卷的信息,可以通过重复调厍CeEnumDBVolumes函数来实现。CeEnumDBVolumes函数的定义如下: BOOL CeEnumDBVo lume s( PCEGUID pGuid, LPWSTR pws zName, DWORD cchMaxName 1: - 参数pGuid用于标识开始列举的数据库卷guid。在首次使用时,应该调月 CREATE INVALIDEDBGUID宏将pGuid设置为无效,然后在下一次调用时,直招 调用上一次的pGuid即可,直到函数返回FALSE值,调用GetLastError函数返匡 ERRORN0MOREITEMS。 参数pwszName用于存储找到的数据库卷名称。 参数cchMaxName表示pwszName的长度。此值应设置足够大,以便能够存l; pwszName值,此值至少应该设置为CEDB_MAXDBASENAMELEN。 如果函数找到一个已装配的数据库卷,将返回TRUE值,并且将数据库卷的标识和名乖分别存储到pGuid和pwszName中;反之,则返回FALSE值。 如下代码实现了列举系统中所有已装配的数据库卷的功能: CEGUID ceguid; TCHAR szvolumeNameCEDB_MAXDBASENAMELEN; 创建无效的GUID CREATEINVALIDEDBGU工D(&ceguid); 列举已装载的数据库卷 while(CeEnumDBVolumes(&ceguid,szVolumeName,sizeof(szVolumeName) TRACE fL”Enum mounted volumes:sn”,szVolumeName)j 上面介绍了EDB列举已经装载的数据库卷的函数,EDB也提供了一套APl函数来列举;据库卷中的数据库,CeFindFirstDatabaseEx用于查找第一个数据库并获取一个查找句柄,然J传递给CeFindNextDatabaseEx函数以继续查找数据库。此APl函数非常类似于文件查找,一不过CeFindFirstDatabaseEx函数只是进行搜索,并不返回数据库对象。 CeFindFirstDatabaseEx函数的定义如下: 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 关闭查找旬柄 C10SeHandle(hEnumDB);e1SeretUrnj判断是数据库类型if(CeObjectInf0wObjType=OBJTYPEDATABASE) TRACE fL”The name of the database is:sn”, CeObjectInf0infDatabaseszDbaseName);)关闭查找句柄CIoseHandle(hEnumDB);枚举系统的所有已经装载的数据库卷以及数据库卷中的数据库void CEDBSampleDl9:0nBnClickedBtnEnumVolumes() CEGUID ceguid; TCHAR szVolumeNameCEDB_MAXDBASENAMELEN; 创建无效的GUIDCREATEINVAL工DEDBGU工D(&ceguid);列举已装载的数据库卷while(CeEnumDBVolumes(&ceguid,SzVolumeName,CEDBMAXDBASENAMELEN一1) TRACE fL”Enum mounted volumes:Sn”,SzVolumeName);ZeroMemory(szVolumeName,CEDB_MAXDBASENAMELEN+2); 列举其中的数据库 EnumDatabasesInVolume(&ceguid); ) +7 8.1.9查找或移动记录 打开数据库后,如果想读取或写入记录,还必须移动数据库的当前指针。EDB提供了CeSeekDatabaseEx函数来查找数据库或移动数据库指针,该函数在查找记录的同时,还设置了数据库的当前指针。CeSeekDatabaseEx函数如果查找到了御应的记录,则返回此记录对象标识,否则返回0值。 0 CeSeekDatabaseEx函数的定义如下: CEOID CeSeekDatabaseEx( 。 HANDLE hDatabase, i DWORD dwSeekType, DWORD dwValue, WORD wNumValS, LPDWORD ipdwIndex ); 参数hDatabase:表示打开的数据库句柄。 参数dwSeekType表示查找记录的类型。dwSeekType参数的取值如表8-9所示。 表8-9 dwSeekType参数取值表 值 描述CEDBSEEK_CEOID根据特定记录对象ID来查找记录CEDBSEEKVALUESMALLER 从数据库当前位置开始查找,直到找到的记录小于所指定 的值 CEDBSEEK_VALUESMALLEROREQUAL 从数据库当前位置开始查找,直到找到的记录小于或者等于 所指定的值 CEDBSEEK_VALUEFIRSTEQUAL 从数据库当前位置开始查找,直到找到的记录与所指定的值 相等。如果没有找到,数据库当前指针将移动数据库尾部, 函数并返回0。指定的值由CEPROPVAL结构数组存储,参 数dwValue指向此结构地址,wNumVals表示数组个数 CEDBSEEK_VALUENEXTEQUAL 从数据库当前位置开始查找,直到找到的记录等于所指定的 值。指定的值由CEPROPVAL结构数组存储,参数dwValue 指向此结构地址 CEDBSEEKVALUEGREATER 从数据库当前记录开始查找,直到找到的记录属性值大于所 指定的值。指定的值由CEPROPVAL结构数组存储,参数 dwValue指向此结构地址 CEDBSEEK_VALUEGREATEROREQUAL 从数据库当前记录开始查找,直到找到的记录属性值大于或 等于所指定的值。指定的值由CEPROPVAL结构数组存储, 参数dwValue指向此结构地址 CEDBSEEKBEGINNING 从数据库记录首部开始查找第n个记录,n的值由dwValue 决定 值 描述CEDBSEEKCURRENT从数据库当前记录开始向前或向后查找第n个记录。n的值由dwValue参数决定,如果是正数则从当前记录开始向后查找第n个记录,如果为负数,则从当前记录开始向前查找第n个记录CEDBSEEK_END从数据库记录末尾开始查找倒数第n个记录,n的值由dwValue决定 CEDBSEEKPREFIX支持按前缀进行查询。此标志只能和strin9、BLOB字段使用。例如:要查找字段中前缀为“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 IGNOREWIDTH 在dwSeekType参数取值的描述中,多次提到了CEPROPVAL结构,以下是该结构的定支说明: typedef structCEPROPVAL CEPROPID propid; WORD wLenDataj , WORD wFlags; CEVALUNION val; )CEPROPVAL; typedef CEPROPVAL+PCEPROPVALj 字段propid表示字段标识。 字段wLenData将被忽略,未被使用。 字段wFlags表示字段属性。在CeSeekDatabase函数中,可以忽略。 字段val是一个联合结构,在实际使用时,应当根据字段的类型选用相应的赋值。尹 中CEVALUNION联合结构的定义如下: typede f unionCEVALUNION( short iVal; 112个字节有符号整数 ; USHORT uiVal; 2个字节无符号整数 二 1。nq iVal; 4个字节有符号整数 、 ULONG uIVal; 4个字节无符号整数 FILETIME filetimej 日期时间结构 LPWSTR ipwstr; 以0结束的UNICODE字符串 CEBLOB blobj CEBLOB结构,这里可用于存储大对象,例如图片或声音文件等 BOOL boolVal j 布尔值 double dblValj 8个字节的有符号值 )CEVALUNION; 参数dwValue表示要查找的值。dwValue具体值由参数dwSeekType决定,读者请参 考表8-9中dwSeekType参数的取值表。 参数wNumVals表示在参数dwValue里,CEPROPVAL结构体数组成员数。此值只 有当dwSeekType类型为 CEDB SEEKLUESMALLER、 CEDB SEEK VALUESMALLEROREQUAL、CEDBSEEK_VALUEFIRSTEQUAL、CEDBSEEK一 LUEGREATER或者CEDB SEEKLUEGREATEROItEQUAL才有意义。 参数lpdwIndex表示找到记录的索引,此值可以设置NULL而被忽略。 若CeSeekDatabaseEx函数返回0,表示没有找到相应记录,否则返回指定记录的OID标识。 CeSeekDatabaseEx函数将使用CeOpenDatabaselnSession(EDB)打开数据库时的排序方式查找或移动记录。如果在打开数据库时没有排序方式,那么CeSeekDatabaseEx只支持如下寻找方式: 。 CEDBSEEKCEOID CEDBSEEKBEGINNING CEDBSEEKCURRENT O CEDBSEEKEND 如果通过CEPROPVAL结构列表查找数据,那么参数propid必须在打开数据库(CeOpenDatabaselnSession)时是存在的排序方式。 EDB比CEDB多了3种查找类型: (1)CEDB_SEEK_VALUESMALLEROREQUAL。茬ECEDB中,CEDB_SEEK_VALUESMALLER实际上是查找第1个小于等于符合条件的记录。在EDB中,需要使用CEDB一SEEKgALUESMALLEROREQUAL来查找第l个小于等于符合条件的记录;在EDB中使用2EDB SEEK VALUESMALLER将查找第l个小于符合条件的记录。 (2)CEDB_SEEK_VALUEGREATEROREQUAL。在CEDB中,CEDBSEEKVALUEGREATER实际上是查找第1个大于等于符合条件的记录。在EDB中,需要使用CEDBSEEKCALUEGREATEROREQUAL来查找第l个大于等于符合条件的记录;在EDB中使用2EDB SEEK VALUEGREATER将查找第l个大于符合条件的记录。 (3)CEDB SEEK PREFIX。在EDB中,可以使用前缀查找字符串或者BLOB字段。要耋找字段中前缀为“AAA”的字符,那么字段中的值为“AAAA”、“AAABC”的将被列举出彩,但是值为“AA”或者“AAB”将不会被查找。 例如下面的代码示例就是简单演示如何查找数据库中字段PID DEM0的值为strValue的行有记录。 HANDLE hDatabase; EDB数据库旬柄,需传入 CString strValue=LnDEM0”; 要查找的字段值,需要传入270Windows CE嵌入式高级编程及其实例详解(用c+实现) CEOID ceOid; DWORD dwIndex=0j CEPROPVAL seekPropVal; ZeroMemory(seekPropVal,sizeof(seekPropVal); seekPropValpropid=PIDDEM0;要查找的字段ID seekPropValvalipwstr=(LPWSTR)strValue;要查找的字段值 查找第1个值 ceOid=CeSeekDatabaseEx(hDatabase,CEDB SEEK VALUEFIRSTEQUAL,(DWORD)seekPropVal,1,&dwIndex); if(ceOid!=0) 查找下面符合条件的值 while(true) ceOid = CeSeekDatabaseEx(hDatabase,CEDBSEEKVALUENEXTEQUAL,(DWOf&seekPropVal,1,&dwIndex)j if(ceOid=0) break; f fl。 ) ) 关于CeSeekDatabaseEx函数就介绍到这里。读者可以参考下面的数据库操作综合示例取更多信息,加深对CeSeekDatabaseEx函数的理解。8110写记录 Windows CE提供了CeWriteRecordProps函数用于向数据库中添加记录或更改记录,数的声明如下:CEOID CeWriteRecordProps( HANDLE hDatabase, CEOID OidRecord, WORD CPropID, CEPROPVAL+prgPropVal);参数hDbase表示要被写入的数据库句柄。此句柄将在打开数据库时获得。参数0idRecord表示要写入记录的标识。如果参数值为0,表示添加一条新的记否则表示更改记录。参数cProplD表示要写入记录的字段个数,同时也表示prgPropVal数组的长度。必须大于0。参数prgPropVal表示要写入记录的结构体。-_。_。l。_。l。 LPBYTE lplpBuffer, LPDWORD lpcbBuffer, HANDLE hHeap ); 参数hDbase指向已打开的数据库句柄。 参数dwFlags为读取标识。如果它的值被设置为CEDB ALLOwREALL0c,那么系 统将用LocalAlloc函数为参数lplpBuffer分配内存,同时如果已分配的缓冲区不够存 储要读取的记录信息,则系统可重新为参数lplpBuffer分配内存。如果设置0,系统 在读数据中,不会对内存进行操作。 参数lpcProplD表示参数rgProplD指向CEPROPID结构的数量。如果rgProplD设置 为NULL,那么该参数将返回读取字段的数量。 参数rgProplD指向CEPROPID结构的数组,表示需要读取的字段。如果该参数被设 置为NULL,那么CeReadRecordProps函数将读取数据库所有字段。 参数lplpBuffer表示缓冲区,用于存储读取到的记录信息。注意该参数不是指向缓冲 区的指针,而是指向缓冲区指针的指针。使用这个指针将是个大胆的想法,因为结果 缓冲区可以由函数重新分配。如果结果缓冲区被重新分配,那么它就可能移动,因此 函数将会修改指向缓冲区的指针,因为该指针可能已经被改变了。同样,在每次使用 完缓冲区之后,都必须释放缓冲区。 参数lpcbBuffer表示参数lplpBuffer缓冲区的大小。 参数hHeap表示当重新分配内存时,指向应用程序创建的堆旬柄。此参数只有当参 数dwFlags被设置成CEDB ALLOW黜认LLOC标识时才有意义。通常可以将此参数 设置NULL。 若函数执行成功,将返回记录对象标识,反之则返回0,同样可以使用GetLastError函数夫取具体错误信息。 如果数据库在打开时设置了CEDB AUTOINC砌MENT标志,那么CeReadRecordPropsEx272 Windows CE嵌入式高级编程及其实例详解(用C+实现)函数执行成功后,数据库指针将指向下一条记录,以便继续连续地读取记录。 EDB比CEDB多了一个CEVT STREAM字段。当调用CeReadRecordPropsEx函数时,CEVT STREAM字段将被当作CEVT BLOB字段来对待。CEVT STREAM字段中的数据将被指向到CEPRoPvAL:valblob成员。如果用CeReadRecordPropsEx函数读取Stream字段,Stream字段也许会非常大,此时系统就要分配很大一块内存以便去存储此数据。相反,如果Stream流字段的数据非常大,可以使用CeOpenStream(EDB)和CeStreamRead(EDB)i函数读取Stream的字段数据。 关于CeReadRecordPropsEx函数的具体使用,读者可参考82节中的数据库操作综合示例。 8112删除记录 Wmdows CE提供了CeDeleteRecord方法用于删除数据库中的某条记录,该函数的定义如下: BOOL CeDeleteRecord( HANDLE hDatabase, CEOID OidRecord ); 。 GENERIC READ流对象只能执行读操作 GENERIC WRITE流对象可以执行读操作和写操作 若函数执行成功,将返回流对象句柄,执行失败则返回INVALID HANDLE VALUE。 成功打开流对象后,可以对流对象进行读取、写入等操作。流对象使用完毕后,要使用CloseHandle函数关闭和释放流对象。 2读写流数据 在流对象被成功打开后就可以读取和写入数据了。可以使用CeStreamRead函数读取流对象中的数据,该函数的定义如下: BOOL CeStreamRead( HANDLE hStream, LPBYTE iprgbBuffer, DWORD cbRead, LPDWORD ipcbRead ); 参数hStream:要执行读操作的流对象旬柄,也就是之前打开的流对象旬柄。 参数lprgbBuffer:指向读取之后的数据缓冲区。 参数cbRead:指定要从流中读取多少字节的数据。 参数lpcbRead:表示从流中读取的实际字节数。该值有可能小于cbRead。 若流数据读取成功,函数返回TRUE,否则返回FALSE。 EDB提供了CeStreamWrite函数用于写入流数据,该函数定义如下: BOOL CeStreamWrite( HANDLE hStream, LPBYTE iprgbBuffer, DWORD cbWrite, LPDWORD lpcbWritten )j 参数hStream:要执行写操作的流对象句柄,也就是之前打开的流对象句柄。 参数lprgbBuffer:指向要写入的数据缓冲区。 参数cbWrite指向要写入的数据大小。此值应小于等于lprgbBuffer缓冲区的大小。 参数lpcbWritten:表示往流中写入的实际字节数。该值有可能小于cbWrite。 若流数据写入成功,函数返回TRUE,否则返回FALSE。 在往流中写入数据后,还必须调用CeStreamSaveChanges函数来提交所做的修改。该函数的定义如下:BOOL CeStreamSaVeChanges( HANDLE hStream);参数hStream:指向要操作的流句柄。 若保存成功,则函数返回TRUE,否则返回FALSE。当执行CeStreamSaveChanges函数保存流数据后,流对象将变成只读,此时如果再调用CeStreamWrite函数,将会失败。 3设置流操作的位置指针 在描述流对象指针之前,再来回顾一下数据库指针方面的知识。EDB记录的读取和写入都是针对当前记录指针的,例如,想要操作数据库中默认的第5条记录,那么就必须用CeSeekDatabaseEx函数将当前记录指针移到第5条记录上。同样,如果要操作数据库默认第5条记录中某个流字段内容,那么首先需要使用CeSeekDatabaseEx函数将当前记录指针移到第5条记录上,然后调用CeOpenStream函数打开流对象,这样流对象就能访问第5条记录上的某个流字段流内容。此时流对象的数据访问指针指向缓冲区的首部。此时如果该缓冲区中已经有了数据,就可以通过CeStreamSeek函数来改变当前流对象数据访问指针,接下来的读取操作都将针对当前指针进行。 CeStreamSeek函数的定义如下: BOOL CeStreamSeek f HANDLE hStream, DWORD cbMove, DWORD dwOrigin, LPDWORD lDcbNewoffset);参数hStream表示要访问流对象句柄。参数cbMove表示要移动指针的字节数。该值需参考dwOrigin值。参数dwOrigin表示移动的开始位置,有如下三种取值: STREAM SEEK SET:从缓冲区的首部开始移动cbMove个字节。 STREAM SEEK CUR:从缓冲区当前指针位置移动cbMove个字节。 ST!AM SEEK END:从缓冲区尾部向前移动cbMove个字节。 参数lpcbNewOffset:函数如果执行成功,存储当前指针位置。该值

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论