#WindowsCE嵌入式高級編程其實例詳解8_第1頁
#WindowsCE嵌入式高級編程其實例詳解8_第2頁
#WindowsCE嵌入式高級編程其實例詳解8_第3頁
#WindowsCE嵌入式高級編程其實例詳解8_第4頁
#WindowsCE嵌入式高級編程其實例詳解8_第5頁
已閱讀5頁,還剩67頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第 8 章 Windows CE 基礎數據庫編程在軟件編程中,數據庫始終是很重要的一個部分。通過數據庫,可以非常方便地存儲和 【索數據,極大的提高工作效率。例如要實現一個個人通訊簿的管理,就可以使用數據 庫,它以非常迅速地實現該項功能。在本章中,將重點介紹 Windows CE 自帶的數據庫系統 EDB。果需要存儲的數據量較小,數據結構相對簡單,EDB將會是非常適用的。本章主要介紹如下內容: EDB 概述 EDB 操作綜合示例81 EDB 概述從 Windows CE 50 開始, Windows CE自帶數據庫系統就包括了 EDB和 CEDB。CEDB 是 Windows CE 50 之前就

2、支持的數據庫系統, EDB是 Windows CE 50 之后新增的數據 庫系統。EDB可以理解成是對 CEDB的升級,新增加了如下功能: 支持事務處理功能。 使用計劃 (schemas 定義數據庫結構。 增加了字段排序功能 ( 支持最多 l6 個字段排序以及排序字段支持所有字段類型。 新增了“流”字段類型。 多用戶訪問。在 Windows CE 5 0、Willdows CE 6 0 中依舊支持 CEDB,關于 CEDB方面的知識讀者 可 以參考 EVC高級編程以及應用開發一書。EDB 數據庫系統支持 10種字段數據類型,如表 81 所示。表 8 110 種字段數據類型表數據類型描述對應常量

3、iVal2 個字節有符號整數CEVT l2uiVU2 個字節無符號整數CEVTUl214個字節有符號整數CEVT l4ulV al4 個字節無符號整數CEVT-U14filetime日期時間結構CEVl jILETIMElpwstr以0結構的 UNICOD字E 符串CEVLPWSTRblobCEBLOB結構,用于存儲一些較小的二進制數據CEVT BLOBBoolVal布爾值CEVT BOOLdblVal8 個字節的有符號值CEVT R8Stream內存流CEVT STREAM/ 67256 Windows CE 嵌入式高級編程及其實例詳解 (用 C+實現 本節將來介紹 EDB的一些重要 APl

4、 函數,這些 APl 函數可以實現創建數據庫、打開數 損庫以及讀寫記錄等功能。8 11 裝配數據卷從 Windows CE 2 1 開始,數據庫文件可以存儲在卷中而不用直接存儲在對象存儲庫 中。數據庫卷是可以存儲 Windows CE 數據庫的特殊格式的文件。在Windows CE 中,如果想把參 據庫存儲在文件中,即要使用數據庫卷,就必須先裝配數據庫卷,并且在關閉數據庫后, 還矗 卸載數據庫卷。裝配數據庫卷具有兩個意思,一是新建數據庫卷,二是打開已存在的數據 在 Windows CE 中裝配數據庫卷可以通過 CeMountDBVolEx 函數來實現,它的定義如下: 傳常BOOL CeMoun

5、tDBVolEx(PCEGUID pGuid ,LPWSTR lpwszDBVol ,CEVOLUMEOPTIONS+pOptio,ns值描述CREATE NEW創建一個新的數據庫卷,如果數據庫卷已存在,函數將失敗CREATE ALWAYS創建一個新的數據庫卷,如果數據庫卷已存在,它將覆蓋舊卷OPEN EXISTING打開一個數據庫卷,如果數據庫卷不存在,函數將失敗OPEN ALWAYS打開一個數據庫卷,如果數據庫卷不存在,則創建一個新的數據庫卷TRUNCATE EXISTING打開一個數據庫卷,并將其截斷為 0字節大小。如果數據庫卷不存在, 函數將失敗如果函數執行成功,將返回 TRUE,還會

6、將參數 pGuid 設置為某一個值,并且此值可 E 差給其他數據庫函數使用。如果函數執行失敗,則可以調用 GetLastError 函數獲取錯誤代 見的錯誤代碼如表 8.3 所示。表 8-3 常見錯誤代碼襲值描述ERROR INVALID PARAMETER表示其中某個參數無效ERROR BAD FORMAT表示數據庫卷來自一個不同的 EDB版本ERROR FILE NOT FOUND表示參數 dwFlags 值為TRUNCATE EXISTIN,G但是要裝載 的數據庫卷不存在翠型蕩目勘茸犁簿鞣軸 SAVA3V-3J :vauD蕈S天VMlv_N丑d0暮蔡s翱I 舭p鞣霉樂些輩 鞍貊回娶驃豳S

7、 工SIXa 凡Qv lv H0日馳衛業哥 pJoMsdzsMdQaIN 日QSSHDDV 0a/ 67擘旃朝娶罾瞽檗犁薄驃 (I驟辮哥DWORD dwFlagS;WCHAR szDbaseNameCFDB MAXDBASENAMELE;NDWORD dwDbaseType;DWORD dwNumRecords jDWORD dwSize;FILETIME ftLastModified ;CESORTORDERSPEC rgSortSpecsCEDB_MAXSORTORD;ER CEDBASEINFOE;X 字段 wVersion :表示此結構體的版本,此值必須設置為2。 字段 wNumSor

8、tOrder :表示在數據庫中能夠被激活的排序字段個數,最大值為16。 字段 dwFlags :表示數據庫標志,它的取值為表8-4 中值的組合。表 8-4 dwFlags 參數取值表值CEDB VALIDNAME表示 szDbaseName成員有效并且將被使用 丟忑 dw Db ase Typ 磊 e 面兩磊酥兩麗 表示 成員有效并且將被使用泵磊 i :;面。成員有效并且將被使用覆荔荔丙 ii 面鬲荔戛號辱罰蜀 i 西藏據庫的壓縮狀態 該參數應與下面的參數共同使用以設置數據厙的壓縮狀態 戛票麗磊麗磊屬菊示柔雨 云磊鬲j 麗此標記被 : SetDatabaselnfoCeS表示創建數據庫時,不采

9、用壓縮方式。如果此標記被 菡數使用,新的記錄或修改的記錄存儲時將不被壓縮。默認情況下, 字段 szDbaseN 鋤 e:表示數據庫名稱,此字符串最多可以包括SQLCEDMAXDBASENAMELE個N 字符。當使用 CeCreateDatabaseWithProps 函數時,此威 必須被設置。 字段 dwDbaseType:表示數據庫類型標識。 字段 dwNumRecords:表示數據庫中的記錄數。/ 67字段 dwSize: EDB中未使用。字段 ftLastModified : EDB中未使用。字段略 sortspecsCEDB_MAXSORTORDER:排序字段定義,是 1 個CESOR

10、。T ORDERSPE結C構體的固定數組,表示只有數組中前 N 個值有意義, N:霧 m 艫鬻勰莖篙凱帆必須艤這些覯方可往靳寫入黼prgPropsEDB 參數 字段描述數組。在 中,必須足義返些子段, 力口 J 仕生叫與八翟循:參 數 硼 妒 rops 是 指 向 CEPROPSPEC結 構 體 的 數 組 ,CEPROPSPE結C構體的定義如下搿塑燮塑湍憾 肌磁一醬搿豳字段 wVersion :表示結構體版本,必須設置為 l字段 propid :表示字段 ID ,用來表示數據庫中的字段。它是一個 32位值,低 l61 表示字段的數據類型,高 16位是用戶定義的值,用來標識字段。例如定義一個字

11、: 串類型的字段“倉庫名稱”,則可以定義如下 propid 值:#define PID STORAGENAME MAKELONG(CELVPTWST,R 1字段 dwFlags :表示字段標志,它為表 8.5 中的值的組合。 表8-5 成員dwFlags 值描述值描述DB PROP NOTNULL表示此字段不能為空DB PROP COMPRESSED表示此字段將被壓縮。此標志僅僅可以應用于 CEVT STREA字M段類 型。如果 Stream 字段被設置為壓縮格式,那么 Stream APl 將不能訪問, 相反必須使用 CeReadRecordPropsEx(EDB函數來訪問在對數據庫進行添加

12、記錄、刪除記錄,查詢記錄等操作之前,必須先打開數據庫。在/ 67 之前曾經介紹過, EDB 打開數據庫需要基于會話連接來打開數據庫,以便系統來維護事務操 作。在 EDB中,可以使用 CeOpenDatabaselnSession 函數打開數據庫。該函數的定義如下: HANDLE CeOpenDatabaseInSession(HANDLE hSession ,PCEGUID pGuid ,PCEOID poid ,塹蟬謄甚硯并暮球咨融明翟智鄧號回琳工 Sl 直N。&0NNNnTNOS aQ丑3磁阜豬專審黜古牲皆。氳、¥蜘彩臥I工ISNaSNIaSVJ J湛OSaq丑3陋j 崮捶罐陋揩辛華督捌0

13、p QNa3s日a確 0s HGHD驟辨珥|jl 。摹華號爵髫辯明中 p8擎槧剪 蒼鋈一薹莖三山I 疆n尋羽百竄警壕妙鴦。一珈璐千些擎人 X xwvWnl 丁確 0S aQ日 3刨驄摹華哥珂掰湃粥業些擎IVNOIZISOd ON ZlIOS-8Qa31 皂率一珈當輩afl0INl-工lIOS HQ丑 3摹g髫擗朝口牮捌單霹0孓辨哥/ 67驟辨剪 s6eId91M 曾搿爭 8擎。號爵明士 9-8擎槧哥碓翠斟茸瓣犁群 s8BId 角M觚秘車 。 (9 Id 嗍 dlxos ,曠 31bs K 耳¥咨磉妙朝豬專茸擗犁群 sdoMumNA 豬專p 。乙槧驀蔡蟛硒卓硎鞘瞬勒當擎 Uo!sa0AA硝右!

14、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 a OM !sdoxdmnNM GHOM !u 。 TSXaAM GHOM x丑 3丑dsH丑a丑。工 Hos一 0nas ;ap。d五 3 :土蟬百暈璐驊竊鎏t# 噼羈 3丑dsaIol 工 0s叫群Vosd。摹華髫揩朝婆呆茸群磉革群 VoSd壕霉1 。蜘彩驥徘 OUmNZsA dI臻霉眵爛 0槧業鷺

15、 p!od嫌霉醬晦。牲零犁群鞣明妊群聯益當擎otuBNz8柚驃霉1。七b p!od 翠黝掣琳碘斟誓艋犁群驃明回娶掣辮驃妊群半pmod咄OlLmNZSAdl 群誹琳 0緊暮蔡 p!od 。濃辮誓胚茸辨壕朗妊群些擎 p!od 臻霉。 QIn0 明捌群磉些擎 p!nod 壕霉0 。崾勘 i6bK 4 o!ssososeqtnefImOOO1巖疆 (HOHuo!ssosmBoaO00甲血耳鎏。鏵嗚弩艇娶號當擎 uo!ssosq 驃霉l !( 一 一十 m M 0IIoN 丑3。 SSWldMP GHOMO,4】。sd早x丑3ad sH丑QH0工Hos。 OmeNz sMdI HlLsMdq 續表值描述

16、CEDB SORT IGNORENONSPACE僅對字符串有效CEDB SORT IGNORESYMBOLS僅對字符串有效CEDB SORT IGNOREKANATYPE不區分 Hiragana 和Katakana 字符。僅對字符串有效CEDB SORT IGNOREWIDTH不區分單字節和雙字節,只對字符串有效CEDB SORT NONNULL表示排序字段不能為 NULLDWORD dwSize DWORD dwParam; UINT uType ; CEGUI D guid ; CEOID oid ; CEOID oidParent ;/ 67CENOTINOTIFICATION;字段 d

17、wSize 表示 CENOTIFICATION結構大小。字段 dwParam存儲在 CENOTIFYREQUES結T構中的 dwParam成員值。字段 uType 表示發送 WM_DBNOTIFICATIO消N息的類型,它可以設置為表8 8 中的任意值。262 Windows CE 嵌入式高級編程及其實例詳解 (用c+實現 表88成員 uType取值表值描述DB CEOID CREATED創建了一個新的數據庫對象DB CEOID DATABASE DELETED數據庫從數據卷中刪除DB CEOID RECORD DELETED記錄從數據庫中刪除DB CEOID FILE DELETED文件被刪

18、除DB CEOID DIRECTORY DELETED目錄被刪除DB CEOID CHANGED數據庫對象被修改,/ 67 參數 hSession 表示會話對象句柄,此參數可以在打開數據庫函數(CeOpenDatabaselnSession 中獲取。此參數與對應的 CeBeginTransaction 函數中的 hSession 值是一樣的。 參數 fCommit 表示結束一個事務的兩種方法,一種是提交事務,把之前的操作全部 更新到數據庫,另一種是回滾事務,把之前的操作全部取消。參數 fCommit 值為 TRUE ,則提交事務,否則回滾事務。當 fCommit 值為 TRUE時,所有的數據變

19、化并 不會實際寫入到磁盤,此時我們還需調用 CeFlushDBVol 函數將數據寫入磁盤。若成功結束事務,函數返回 TRUE,否則返回 FALSE。8 17 刪除數據庫EDB 提供了 CeDeleteDatabase 函數來刪除數據庫卷中的數據庫,包括刪除數據庫中的記 錄。該函數定義如下:BOOL CeDeleteDatabase( 264 window!cE 嵌入式高級編程及其實例詳解 ( 用 c+實現 / 67PCEGUID pGuid,CEOID Oid 參數 p 伽 d 表示要刪除的數據庫所在的數據庫卷標識,可由 CeMountDbVolEx 函數 獲取。參數 oid 表示要刪除的數據

20、庫對象標識; 0id 值必須已經被 CeCrea 卸撕 base 晰吐 證 mIsD:B函數生成。成功刪除數據庫后將返回 TRUE,否則返回 FALSE。同樣的,可以使用 GetLastError 函 數獲取函數執行錯誤信息。8 18 枚舉數據庫卷以及數據庫。如果需要了解當前系統中已裝配好的數據卷的信息,可以通過重復調厙 CeEnumDBVolumes函數來實現。 CeEnumDBVolumes函數的定義如下:BOOL CeEnumDBVo lume s(PCEGUID pGuid ,LPWSTR pws zName ,DWORD cchMaxName1 : - 參數 pGuid 用于標識開始

21、列舉的數據庫卷 guid 。在首次使用時,應該調月CREATE INVALIDEDBGUID 宏將 pGuid 設置為無效,然后在下一次調用時,直招 調用上一次的 pGuid 即可,直到函數返回 FALSE值,調用 GetLastError 函數返匡ERROR N0 MORE ITEMS。 參數 pwszName用于存儲找到的數據庫卷名稱。 參數 cchMaxName表示 pwszName的長度。此值應設置足夠大,以便能夠存l ;pwszName 值,此值至少應該設置為 CEDB_MAXDBASENAME。LEN如果函數找到一個已裝配的數據庫卷,將返回TRUE值,并且將數據庫卷的標識和名乖分別

22、存儲到 pGuid 和 pwszName中;反之,則返回 FALSE值。如下代碼實現了列舉系統中所有已裝配的數據庫卷的功能:CEGUID ceguid ;TCHAR szvolumeNameCEDB_MAXDBASENAMELE;N 創建無效的 GUIDCREATE INVALIDEDBGU工 D(&ceguid ; 列舉已裝載的數據庫卷while(CeEnumDBVolumes(&ceguid , szVolumeName, sizeof(szVolumeNameTRACE fL”Enum mounted volumes: s n”, szVolumeNamej上面介紹了 EDB 列舉已經裝

23、載的數據庫卷的函數, EDB 也提供了一套 APl 函數來列 舉;據庫卷中的數據庫, CeFindFirstDatabaseEx 用于查找第一個數據庫并獲取一個查找句 柄,然 J傳遞給 CeFindNextDatabaseEx 函數以繼續查找數據庫。此 APl 函數非常類似于文件查找,/ 67不過 CeFindFirstDatabaseEx 函數只是進行搜索,并不返回數據庫對象。CeFindFirstDatabaseEx 函數的定義如下:HANDLE CeFindFirstDatabaseEx(10 / 67retUrn ;11 / 67開始枚舉數據庫 while(CeOid=CeFindNe

24、xtDatabaseEx(hEnumDB , NULL!。 0 ZeroMemory(&CeObjectInf0 , sizeof(CeObjectInfo ;CeObj ectInf0 wVersion=2 ;得到數據庫信息if(!CeOidGetInfoEx2(pGuid, CeOid, &CeObj ectInfo dwError=GetLastError(jTRACE(L-the last error: d n”, dwErrorj關閉查找旬柄C10SeHandle(hEnumDB ;e1SeretUrnj 判斷是數據庫類型 if(CeObjectInf0 wObjType=OBJTY

25、PE DATABASE TRACE fL”The name of the database is : s n”,CeObjectInf0infDatabase szDbaseName; 關閉查找句柄 CIoseHandle(hEnumDB; 枚舉系統的所有已經裝載的數據庫卷以及數據庫卷中的數據庫 void CEDB SampleDl9 : 0nBnClickedBtnEnumVolumes( CEGUID ceguid ;TCHAR szVolumeNameCEDB_MAXDBASENAMELE;N創建無效的 GUIDCREATEINVAL 工 DEDBGU工 D(&ceguid ; 列舉已裝

26、載的數據庫卷 while(CeEnumDBVolumes(&ceguid , SzVolumeName, CEDB MAXDBASENAMEL一EN1 TRACE fL” Enum mounted volumes: S n”, SzVolumeName; ZeroMemory(szVolumeName,CEDB_MAXDBASENAMELEN;+2/ 67列舉其中的數據庫EnumDatabasesInVolume(&ceguid ; + + + + + + + + + + 78.1.9 查找或移動記錄 打開數據庫后,如果想讀取或寫入記錄,還必須移動數據庫的當前指針。EDB提供了CeSeekDa

27、tabaseEx函數來查找數據庫或移動數據庫指針,該函數在查找記錄的同時,還設置 了數據庫的當前指針。 CeSeekDatabaseEx函數如果查找到了御應的記錄,則返回此記錄對象 標識,否則返回 0值。 0CeSeekDatabaseEx 函數的定義如下:CEOID CeSeekDatabaseEx( 。HANDLE hDatabase , iDWORD dwSeekType ,DWORD dwValue ,WORD wNumValS ,LPDWORD ipdwIndex ;參數 hDatabase :表示打開的數據庫句柄。參數 dwSeekType表示查找記錄的類型。 dwSeekType

28、參數的取值如表 8-9 所示。 表 8-9 dwSeekType 參數取值表值描述CEDB SEEK CEOID根據特定記錄對象 ID來查找記錄CEDB SEEK VALUESMALLER從數據庫當前位置開始查找,直到找到的記錄小于所指定 的值CEDB SEEK VALUESMALLEROREQUAL從數據庫當前位置開始查找,直到找到的記錄小于或者等于 所指定的值CEDB SEEK VALUEFIRSTEQUAL從數據庫當前位置開始查找,直到找到的記錄與所指定的值 相等。如果沒有找到,數據庫當前指針將移動數據庫尾部, 函數并返回 0。指定的值由 CEPROPVA結L構數組存儲,參 數 dwVa

29、lue 指向此結構地址, wNumVals表示數組個數CEDB SEEK VALUENEXTEQUAL從數據庫當前位置開始查找,直到找到的記錄等于所指定的 值。指定的值由 CEPROPVA結L構數組存儲,參數 dwValue 指向此結構地址CEDB SEEK VALUEGREATER從數據庫當前記錄開始查找,直到找到的記錄屬性值大于所 指定的值。指定的值由 CEPROPVA結L構數組存儲,參數 dwValue 指向此結構地址CEDB SEEK VALUEGREATEROREQUAL從數據庫當前記錄開始查找,直到找到的記錄屬性值大于或 等于所指定的值。指定的值由 CEPROPVA結L構數組存儲,

30、 參數 dwValue指向此結構地址CEDB SEEK BEGINNING從數據庫記錄首部開始查找第 n個記錄, n的值由 dwValue 決定值描述/ 67CEDB SEEK CURRENT從數據庫當前記錄開始向前或向后查找第 n個記錄。 n的值 由dwValue 參數決定,如果是正數則從當前記錄開始向后查 找第 n個記錄,如果為負數,則從當前記錄開始向前查找第 n個記錄CEDB SEEK END從數據庫記錄末尾開始查找倒數第 n個記錄, n的值由 dwValue 決定 CEDBSEEK PREFIX支持按前綴進行查詢。此標志只能和 strin9 、BLOB字段使 用。例如:要查找字段中前綴

31、為“ AAA”字符,那么字段中 的值為“ AAAA” 、 “ AAABC”將被列舉出 來,但是值為 “從”或者“ AAB”將不會被查找。 此標志還必須和以前的查找類型組合使用: CEDB SEEK VALUEFIRSTEQUAL CEDB SEEK VALUESMALLER CEDB SEEK、, ALUEGREATER CEDB SEEK VALUESMALLEROREQUAL CEDB SEEK VALUEGREATEROREQUAL 使用下面的標志,前綴可以忽略事件: NORM IGNORECASE NORM IGNORENONSPACE NORM IGNOREKANATYPE NORM

32、 IGNOREWIDTH在 dwSeekType參數取值的描述中,多次提到了 CEPROPVA結L構,以下是該結構的定支 說明:typedef struct CEPROPVALCEPROPID propid ;WORD wLenDataj ,WORD wFlags ;CEVALUNION val ;CEPROPVAL;typedef CEPROPVAL+PCEPROPVALj字段 propid 表示字段標識。字段 wLenData將被忽略,未被使用。字段 wFlags 表示字段屬性。在 CeSeekDatabase函數中,可以忽略。字段val 是一個聯合結構,在實際使用時,應當根據字段的類型選

33、用相應的賦值。尹 中CEVALUNIO聯N合結構的定義如下:typede f union CEVALUNION(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布爾值/ 67double dblValj 8 個字節的有符

34、號值CEVALUNION ; 參數 dwValue 表示要查找的值。 dwValue 具體值由參數 dwSeekType 決定,讀者請 參考表 8-9 中 dwSeekType 參數的取值表。 參數 wNumVals 表示在參數 dwValue 里, CEPROPVA結L 構體數組成員數。此值只 有當 dwSeekType 類型為 CEDB SEEK LUESMALLE、R CEDB SEEKVALUESMALLEROREQUA、LCEDB SEEK_VALUEFIRSTEQU、ALCEDBSEEK一 LUEGREATE或R 者 CEDB SEEK LUEGREATEROItEQUA才L有意義

35、。 參數 lpdwIndex 表示找到記錄的索引,此值可以設置NULL而被忽略。若 CeSeekDatabaseEx 函數返回 0 ,表示沒有找到相應記錄,否則返回指定記錄的OID 標識。CeSeekDatabaseEx 函數將使用 CeOpenDatabaselnSession(EDB 打開數據庫時的排序方式 查找或移動記錄。如果在打開數據庫時沒有排序方式,那么 CeSeekDatabaseEx 只支持如下 尋找方式: 。 CEDB SEEK CEOID CEDB SEEK BEGINNING CEDB SEEK CURRENTO CEDB SEEK END如果通過 CEPROPVA結L 構

36、列表查找數據,那么參數 propid 必須在打開數據庫 (CeOpenDatabaselnSession 時是存在的排序方式。EDB 比 CEDB多了 3 種查找類型: (1CEDB_SEEK_VALUESMALLEROREQ。UA茬L ECEDB中, CEDB_SEEK_VALUESMALLER 實際上是查找第 1 個小于等于符合條件的記錄。在EDB中,需要使用 CEDB一 SEEKgALUESMALLEROREQU來A查L 找第 l 個小于等于符合條件的記錄;在EDB中使用2EDB SEEK VALUESMALLE將R查找第 l 個小于符合條件的記錄。(2CEDB_SEEK_VALUEGR

37、EATEROREQU。A在L CEDB中, CEDB SEEKVALUEGREATER 實際上是查找第 1 個大于等于符合條件的記錄。在EDB中,需要使用 CEDBSEEKCALUEGREATEROREA查L找第 l 個大于等于符合條件的記錄;在EDB中使用2EDB SEEK VALUEGREATE將R查找第 l 個大于符合條件的記錄。(3CEDB SEEK PREFIX 。在 EDB中,可以使用前綴查找字符串或者BLOB字段。要耋找字段中前綴為“ AAA”的字符,那么字段中的值為“ AAAA”、“ AAABC”的將被列舉出 彩,但是值為“ AA”或者“ AAB”將不會被查找。PID DEM0

38、 的值為 strValue 的例如下面的代碼示例就是簡單演示如何查找數據庫中字段 行有記錄。HANDLE hDatabase ; EDB數據庫旬柄,需傳入CString strValue=LnDEM0 ”;要查找的字段值,需要傳入/ 67270Windows CE嵌入式高級編程及其實例詳解 (用 c+實現CEOID ceOid ;DWORD dwIndex=0jCEPROPVAL seekPropVal ;ZeroMemory( seekPropVal , sizeof(seekPropVal ;seekPropVal propid=PID DEM;0 要查找的字段 IDseekPropVal

39、 val ipwstr=(LPWSTRstrValue ;要查找的字段值 查找第 1 個值ceOid=CeSeekDatabaseEx(hDatabase ,CEDB SEEK VALUEFIRSTEQU,AL(DWORD seekPropVal , 1,&dwIndex;if(ceOid!=0 查找下面符合條件的值while(trueceOid = CeSeekDatabaseEx(hDatabase,CEDB SEEKVALUENEXTEQUAL,(DWOf&seekPropVal , 1, &dwIndexjif(ceOid=0break ;f fl 。關于 CeSeekDatabase

40、Ex 函數就介紹到這里。讀者可以參考下面的數據庫操作綜合示例 取更多信息,加深對 CeSeekDatabaseEx 函數的理解。/ 678110 寫記錄Windows CE 提供了 CeWriteRecordProps 函數用于向數據庫中添加記錄或更改記錄, 數的聲明如下:CEOID CeWriteRecordProps(HANDLE hDatabase ,CEOID OidRecord ,WORD CPropID ,CEPROPVAL+prgPropVal;參數 hDbase 表示要被寫入的數據庫句柄。此句柄將在打開數據庫時獲得。參數 0idRecord 表示要寫入記錄的標識。如果參數值為0

41、,表示添加一條新的記否則表示更改記錄。參數 cProplD 表示要寫入記錄的字段個數,同時也表示 prgPropVal 數組的長度。 必須大于 0。參數 prgPropVal 表示要寫入記錄的結構體。/ 67-_ 。 _。 l 。 _ 。 l 。LPBYTE lplpBuffer ,LPDWORD lpcbBuffer ,HANDLE hHeap ; 參數 hDbase 指向已打開的數據庫句柄。 參數 dwFlags 為讀取標識。如果它的值被設置為CEDB ALLOwREALL0,c那么系統將用 LocalAlloc 函數為參數 lplpBuffer 分配內存,同時如果已分配的緩沖區不夠 存儲

42、要讀取的記錄信息,則系統可重新為參數 lplpBuffer 分配內存。如果設置 0,系統 在讀數據中,不會對內存進行操作。 參數 lpcProplD 表示參數 rgProplD 指向 CEPROPID結構的數量。如果 rgProplD 設 置為 NULL,那么該參數將返回讀取字段的數量。 參數 rgProplD 指向 CEPROPID結構的數組,表示需要讀取的字段。如果該參數被設置為 NULL,那么 CeReadRecordProps 函數將讀取數據庫所有字段。 參數 lplpBuffer 表示緩沖區,用于存儲讀取到的記錄信息。注意該參數不是指向 緩沖區的指針,而是指向緩沖區指針的指針。使用這

43、個指針將是個大膽的想法,因為結果緩沖區可以由函數重新分配。如果結果緩沖區被重新分配,那么它就可能移動,因此函數將會修改指向緩沖區的指針,因為該指針可能已經被改變了。同樣,在每次使用 完緩沖區之后,都必須釋放緩沖區。 參數 lpcbBuffer 表示參數 lplpBuffer 緩沖區的大小。 參數 hHeap 表示當重新分配內存時,指向應用程序創建的堆旬柄。此參數只有當參數 dwFlags 被設置成 CEDB ALLOW黜認 LLOC標識時才有意義。通常可以將此參數設置 NULL。若函數執行成功,將返回記錄對象標識,反之則返回0,同樣可以使用 GetLastError 函數 夫取具體錯誤信息。如

44、果數據庫在打開時設置了 CEDB AUTOINC砌 MENT標志,那么 CeReadRecordPropsEx/ 67272 Windows CE 嵌入式高級編程及其實例詳解 (用 C+實現 函數執行成功后,數據庫指針將指向下一條記錄,以便繼續連續地讀取記錄。EDB 比 CEDB多了一個 CEVT STREAM字段。當調用 CeReadRecordPropsEx 函數時, CEVT STREAM字段將被當作 CEVT BLOB字段來對待。 CEVT STREAM字段中的數據將 被指向到 CEPRoPvA:L : val blob 成員。如果用 CeReadRecordPropsEx 函數讀取

45、Stream 字段,Stream 字段也許會非常大,此時系統就要分配很大一塊內存以便去存儲此數據。相反,如 果Stream 流字段的數據非常大,可以使用CeOpenStream(EDB和 CeStreamRead(EDBi 函數讀取Stream 的字段數據。關于 CeReadRecordPropsEx 函數的具體使用,讀者可參考 8 2 節中的數據庫操作綜合 示例。8 112 刪除記錄Wmdows CE 提供了 CeDeleteRecord 方法用于刪除數據庫中的某條記錄,該函數的定 義如下:BOOL CeDeleteRecord(HANDLE hDatabase ,CEOID OidReco

46、rd/ 67 GENERIC READ 流對象只能執行讀操作 GENERIC WRITE 流對象可以執行讀操作和寫操作 若函數執行成功,將返回流對象句柄,執行失敗則返回INVALID HANDLE VALUE。成功打開流對象后,可以對流對象進行讀取、寫入等操作。流對象使用完畢后,要使 用CloseHandle 函數關閉和釋放流對象。讀寫流數據在流對象被成功打開后就可以讀取和寫入數據了。可以使用 CeStreamRead 函數讀取流對 象中的數據,該函數的定義如下:BOOL CeStreamRead(HANDLE hStream ,LPBYTE iprgbBuffer ,DWORD cbRead

47、 ,LPDWORD ipcbRead ; 參數 hStream :要執行讀操作的流對象旬柄,也就是之前打開的流對象旬柄。/ 67 參數 lprgbBuffer :指向讀取之后的數據緩沖區。 參數 cbRead:指定要從流中讀取多少字節的數據。 參數 lpcbRead :表示從流中讀取的實際字節數。該值有可能小于cbRead。若流數據讀取成功,函數返回 TRUE,否則返回 FALSE。EDB 提供了 CeStreamWrite 函數用于寫入流數據,該函數定義如下:BOOL CeStreamWrite(HANDLE hStream ,LPBYTE iprgbBuffer ,DWORD cbWrit

48、e ,LPDWORD lpcbWrittenj 參數 hStream :要執行寫操作的流對象句柄,也就是之前打開的流對象句柄。 參數 lprgbBuffer :指向要寫入的數據緩沖區。 參數 cbWrite 指向要寫入的數據大小。此值應小于等于 lprgbBuffer 緩沖區的 大小。 參數 lpcbWritten :表示往流中寫入的實際字節數。該值有可能小于 cbWrite 。 若流數據寫入成功,函數返回 TRUE,否則返回 FALSE。在往流中寫入數據后,還必須調用 CeStreamSaveChanges 函數來提交所做的修改。該 函數的定義如下:BOOL CeStreamSaVeChan

49、ges(HANDLE hStream;參數 hStream :指向要操作的流句柄。若保存成功,則函數返回 TRUE,否則返回 FALSE。當執行 CeStreamSaveChanges 函數 保存流數據后,流對象將變成只讀,此時如果再調用 CeStreamWrite 函數,將會失敗。設置流操作的位置指針 在描述流對象指針之前,再來回顧一下數據庫指針方面的知識。 EDB 記錄的讀取和寫 入都是針對當前記錄指針的,例如,想要操作數據庫中默認的第 5 條記錄,那么就必須用 CeSeekDatabaseEx 函數將當前記錄指針移到第 5 條記錄上。同樣,如果要操作數據庫默認 第5條記錄中某個流字段內容

50、,那么首先需要使用 CeSeekDatabaseEx 函數將當前記錄指針移到 第5 條記錄上,然后調用 CeOpenStream 函數打開流對象,這樣流對象就能訪問第 5 條記錄上 的 某個流字段流內容。此時流對象的數據訪問指針指向緩沖區的首部。此時如果該緩沖區中 已經有了數據,就可以通過 CeStreamSeek 函數來改變當前流對象數據訪問指針,接下來的讀取 操作都將針對當前指針進行。/ 67CeStreamSeek 函數的定義如下:BOOL CeStreamSeek f HANDLE hStream , DWORD cbMove , DWORD dwOrigin ,LPDWORD lDc

51、bNewoffset; 參數 hStream 表示要訪問流對象句柄。參數 cbMove 表示要移動指針的字節數。該值需參考dwOrigin 值。參數 dwOrigin 表示移動的開始位置,有如下三種取值: STREAM SEEK SET :從緩沖區的首部開始移動 cbMove 個字節。 STREAM SEEK CU:R從緩沖區當前指針位置移動cbMove 個字節。 ST !AM SEEK END:從緩沖區尾部向前移動 cbMove 個字節。 參數 lpcbNewOffset :函數如果執行成功,存儲當前指針位置。該值表示的是從 緩沖區首部到當前位置的字節數,它也可被設置為NULL,表示忽略。若

52、函數執行成功,則返回 TRUE,否則返回 NULL。關于 EDB中字段流的操作函數就簡要介紹到這里,讀者可以參考下面的數據庫操作綜合 示例獲取更多信息。8 2 數據庫操作綜合示例 在上節中介紹了許多操作數據庫的 APl 函數,本節就應用上節中所介紹的 APl 函數來 實 現一個小型數據庫的示例。這其中涉及到了數據庫的創建、打開、數據記錄的讀寫、數據 記錄 的查找、以及流字段的使用。相信讀者看完本示例,將會對EDB 有更為深入地了解。這個小 型數據庫將記錄學生的一些基本信息,數據庫中的字段如表8 10 所示。表 8 10 學生數據表結構字段名稱宇段類型備注學生編號Char(7學生姓名Char(2

53、0學生生日FILETIME屬于日期類型學生身高Int學生照片Stream/ 67下面就分步驟詳細介紹該示例的實現過程。(1 建立新項目。使用 VS2005IVC+智能設備 IMFC 智能設備應用程序向導創建一個基于對話框的應用 程 序 EDBUse,編譯環境設置為Windows Mobile 6 Professional SDK(ARMV4I,設備選擇CHSWindows Mobile 6 Classic Emulator,把窗口字體改成宋體小五號。在第 l 節介紹 EDB 編程時提到過必須首先在預處理器中定義 EDB 標識,因此選擇 VS2005 項目主菜單“項目 IEDB 屬性”打開 ED

54、B項目屬性頁,選擇“配置屬l 生 lc c+1 預處 理器”,在 預定義處理器中增加 EDB的定義,如圖 82 所示。圖 8-2 增加 EDB預處理器定義(2 創建 ClmageST 類,用于顯示學生照片。 該示例中的學生照片將支持 BMP、 JPG和 GIF 等系統支持的圖片格式。該步驟將 創建ClmageST 類用于顯示學生照片。 ClmageST 類繼承于 CStatic ,提供了 LoadlmageFromFile 和LoadlmageFromBuffer 兩個方法,分別用來從文件中加載圖像進行顯示和從內存緩沖區中 加載圖像進行顯示。 ClmageST類的定義文件如程序清單 82 所示

55、。 + 程 序 清 單 8 2 7- - - - - - -+Copyright(C2008 Eric Wong+ 本版僅供讀者參考,不得用于任何商業行為文件名稱: ImageST h+文件標識:+摘要:繼承 CStatic 控件,用于顯示圖像:* CImageST 提供了從文件中加載圖像和從內存中加載圖像兩種方法/ 67* 當前版本: 1 0+作者:汪兵 Eric Wong *完成日期: 2008 年 4月 10 日 virtual CImageST(;protected :WM PAINT處理方法,用于繪制圖像afx msg void OnPaint( ;DECLARE MESSAGE伍J

56、 P(public :從文件中加載圖像BOOL LoadImageFromFile(LPCTSTR strFileName 圖像文件名 + j 從內存中加載圖像BOOL LoadImageFromBuffer(const DWORD dwBufLen , 緩沖區長度 const BYTE+pBuffer緩沖區 + ;private : Image 工廠接口對象IImagingFactory m_pImagingFactory ; Image 接口對象IImage+m_pImage ; CImageST類的實現文件如程序清單 8 3 所示。/ 67 + 程 序 清 單 8 37 - - - -

57、- +Copyright(C2008 Eric Won9 *本版僅供讀者參考,不得用于任何商業行為 文件名稱: ImageST cpp +文件標識: +摘要:繼承 CStatic 控件,用于顯示圖像; + CImageST 提供了從文件中加載圖像和從內存中加載圖像兩種方法 當前版本: 1 0 作者:汪兵 Eric Wong+完成日期: 2008 年 4月 10 日+取代版本:+原作者:+完成日期:#include ” stdafx , h”#include ” initguid h”#include ” ImageST h”IMPLEMENT DYNAMIC(CImageS,T CStatic

58、構造函數CImageST: CImageST( m_pImagingFactory=NULL ; Image 工廠接口對象 m_pImage=NULL ; Image 接口對象HRESULT hr;初始化 COM環境if(FAILED(hr=CoInitializeEx(NULL ,COINIT MULTITHREADED TRACE(L”COINIT_MULTITHREADED ER”RO;Rreturn ; 得到 Image 工廠接口對象 hr=CoCreateInstance(CLSID ImagingFactory ,NULL ,CLSCTX INPROC SERVER,IID l工

59、magingFactory ,(v oid+ &m p 工 magingFactory ;/ 67析構函數CImageST:一 CImageST(釋放 IImage 接口對象 if(m_pImage(m_pImage 一 Release(jm_pImage 2 NULL ;釋放 IImagingFact 。 ry 接口對象if(m pImagingFactorym_pImagingFactory 一 Release( ; m_pImagingFactory 。 NULL;釋放程序占用的 COM資源CoUninitialize( ;BEGIN MESSAGE MAP(CImageS,TCStat

60、icON WM PAINT(END MESSAGE MAP(IIWM PAINT 繪制圖片void CImageST : 0nPaint(CPaintDC dc(thiS ; device context for painting 定義繪制尺寸RECT rect ;GetClientRect( rect ; if(m pImage/ 67繪制圖片m_pImage 一 Draw(dc m_hDC, &rect , NULL;從文件中加載圖像+圖像文件名 + , &m_pImage;BOOL CImageST: LoadImageFromFile(LPCTSTR strFileName f fHR

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論