织梦CMS - 轻松建站从此开始!

罗索

EDB数据库的操作

jackyhwei 发布于 2010-12-06 22:03 点击:次 
WM5以前的系统中一般都是使用的CEDB数据库,EDB是WM5中的新特性之一。为了改善应用程序的性能和长期可移植性,CEDB 已经被 EDB 所取代。EDB 利用了SQLMobile使用的存储子系统,并且提供了明显优于 CEDB 的性能(尤其是在与持久存储区一起使用时)。
TAG:

装配数据库卷:BOOL CeMountDBVol( PCEGUID pceguid, LPWSTR lpszDBVol,DWORD dwFlags);

卸载数据库卷:BOOL CeUnmountDBVol(PCEGUID pceguid);

创建数据库:CEOID CeCreateDatabaseEx( PCEGUID pceguid, CEDBASEINFO *lpCEDBInfo);

打开数据库: HANDLE CeOpenDatabaseEx( PCEGUID pceguid, PCEOID poid,LPWSTR lpszName, CEPROPID propid, DWORD dwFlags,CENOTIFYREQUEST *pReq);

写数据库: CEOID CeWriteRecordProps(HANDLE hDbase, CEOID oidRecord, WORD cPropID, CEPROPVAL *rgPropVal),

读数据库: CEOID CeReadRecordPropsEx( HANDLE hDbase, DWORD dwFlags,LPWORD lpcPropID, CEPROPID *rgPropID, LPBYTE *lplpBuffer,LPDWORD lpcbBuffer, HANDLE hHeap);

删除记录:BOOL CeDeleteRecord(HANDLE hDatabase, CEOID oidRecord);

移动指针:CEOID CeSeekDatabaseEx(HANDLE hDatabase,DWORD dwSeekType, DWORD dwValue, WORD wNumVals, LPDWORD lpdwIndex);

EDB是从Windows Mobile 5.0后出现的,提供了比CEDB更好的性能。

要使用EDB,首先就是mount

  1. BOOL CeMountDBVol( 
  2. PCEGUID pceguid, 
  3. LPWSTR lpszDBVol, 
  4. DWORD dwFlags 
  5. ); 

它的第一个参数是一个CEGUID类型的指针,也是一种唯一标识符,一般在开始使用前先用CREATE_SYSTEMGUID来将其清0。第二个参数就是数据库卷的卷名,第三个参数就标志,这个标志位的意义与CreateFile的非常类似,其实EDB也是一种特殊的文件。也可以用CeMountDBVolEx函数来挂载卷。

 

将卷挂上之后,就可以使用CeCreateDatabaseWithProps函数来创建数据库。它的声明如下:

  1. CEOID CeCreateDatabaseWithProps( 
  2. PCEGUID pGuid, 
  3. CEDBASEINFOEX* pInfo, 
  4. DWORD cProps, 
  5. CEPROPSPEC* prgProps 
  6. ); 

第一个参数就是CeMountDBVol的第一个参数传回的CEGUID,第二个参数是重点,里面包含了要创建的数据库的结构,即每个属性列的类型等。第三个参数指示了第四个参数的个数。第四个参数是好像是指定属性列的一些其它信息用的(这个也不清楚)。

CEDBASEINFOEX的定义如下:

  1. typedef struct CEDBASEINFOEX { 
  2. WORD wVersion; 
  3. WORD wNumSortOrder; 
  4. DWORD dwFlags; 
  5. WCHAR szDbaseName[CEDB_MAXDBASENAMELEN]; 
  6. DWORD dwDbaseType; 
  7. DWORD dwNumRecords; 
  8. DWORD dwSize; 
  9. FILETIME ftLastModified; 
  10. SORTORDERSPECEX rgSortSpecs[CEDB_MAXSORTORDER]; 
  11. } CEDBASEINFOEX; 

例如这段代码就创建了一个有两个属性列的数据库,第一个属性是名字,第二个属性是年龄。

  1. CEDBASEINFOEX dbInfo = {0}; 
  2. dbInfo.wVersion = CEDBASEINFOEX_VERSION; 
  3. dbInfo.dwFlags = CEDB_VALIDDBFLAGS | CEDB_VALIDNAME | CEDB_VALIDSORTSPEC; 
  4. dbInfo.wNumSortOrder = 1; 
  5. _tcscpy(dbInfo.szDbaseName, szDbname); 
  6. dbInfo.rgSortSpecs[0].wVersion = SORTORDERSPECEX_VERSION; 
  7. dbInfo.rgSortSpecs[0].wNumProps = 1; 
  8. dbInfo.rgSortSpecs[0].wKeyFlags = 0; 
  9. dbInfo.rgSortSpecs[0].rgPropID[0] = PROP_NAME; 
  10. dbInfo.rgSortSpecs[0].rgdwFlags[0] = CEDB_SORT_UNKNOWNFIRST; 
  11. dbInfo.rgSortSpecs[1].wVersion = SORTORDERSPECEX_VERSION; 
  12. dbInfo.rgSortSpecs[1].wNumProps = 1; 
  13. dbInfo.rgSortSpecs[1].wKeyFlags = 0; 
  14. dbInfo.rgSortSpecs[1].rgPropID[0] = PROP_AGE; 
  15. dbInfo.rgSortSpecs[1].rgdwFlags[0] = CEDB_SORT_UNKNOWNFIRST; 
  16.  
  17. CeCreateDatabaseWithProps(&g_VolGuid, &dbInfo, 0, NULL); 

因为rgSortSpecs数组被定义为16,所以EDB的属性列最多也就是16。

当创建好数据库之后,就可以打开数据库了,然后才能进行读写数据库。

要打开数据库,先用CeCreateSession创建一个会话,然后用CeOpenDatabaseInSession来得到一个数据库句柄。

写数据库是通过CeWriteRecordProps函数来实现的。

CeWriteRecordProps的定义如下:

  1. CEOID CeWriteRecordProps( 
  2. HANDLE hDatabase, 
  3. CEOID oidRecord, 
  4. WORD cPropID, 
  5. CEPROPVAL* prgPropVal 
  6. ); 

若oidRecord为0,则新添加的记录直接追加到最后。最后一个参数是用来填充属性的数据。

要写数据库,示例代码如下:

  1. prop[0].propid = PROP_NAME; 
  2. prop[0].val.lpwstr = _T("某某"); 
  3. prop[0].wFlags = 0; 
  4. prop[1].propid = PROP_AGE; 
  5. prop[1].val.uiVal = 25; 
  6. prop[1].wFlags = 0; 
  7. CeWriteRecordProps(hdb, 0, 2, prop); 

要想读数据库,只要用CeReadRecordPropsEx函数即可。

它的定义如下:

  1. CEOID CeReadRecordPropsEx( 
  2. HANDLE hDatabase, 
  3. DWORD dwFlags, 
  4. LPWORD lpcPropID, 
  5. CEPROPID* prgPropID, 
  6. LPBYTE lplpBuffer, 
  7. LPDWORD lpcbBuffer, 
  8. HANDLE hHeap 
  9. ); 

第三个参数是返回属性列的个数,第四个参数即是用来指定要接收哪些属性列的数据,如果为NULL,则接收所有。第五个参数即是返回的数据。如果第二个参数指定为:CEDB_ALLOWREALLOC的话,则在不必要使用lplpBuffer之前申请空间。最后一个参数就是要使用的堆的句柄。

再操作完之后,要使用CloseHandle关闭数据库的句柄,并且再最后CeUnmountDBVol卸载数据库。

EDB数据库的操作

一、WM5以前的系统中一般都是使用的CEDB数据库,EDB是WM5中的新特性之一。为了改善应用程序的性能和长期可移植性,CEDB 已经被 EDB 所取代。EDB 利用了 SQL Mobile 使用的存储子系统,并且提供了明显优于 CEDB 的性能(尤其是在与持久存储区一起使用时)。因为 CEDB 提供了与 EDB 完全相同的函数集 ,所有函数都具有相同的名称和参数列表。但是EDB中也包含了CEDB中所没有函数,并且创建方法也不相同了,要比CEDB复杂。

二、EDB数据库的创建和基本操作

1.创建数据库卷:

  1. CeMountDBVol( );//创建卷 
  2. CeCreateDatabaseWithProps();//卷创建成功后创建EDB 
  3. CeCreateSession();//EDB创建成功后创建session,用于打开EDB 
  4. CeOpenDatabaseInSession();//打开EDB 

创建EDB时前还要创建一个CEDBASEINFOEX对象,这个对象用于创建EDB中的info,用于设定EDB。

在打开时还要维护一个全局的HANDLE,在以后的操作中是要使用的.

2.对数据库进行读,写,删除的操作

CeSeekDatabaseEx();//定位所要找的数据

CeReadRecordPropsEx();//读出定位的数据

创建一个CEPROPVAL对象,将所要定位数据的条件传给这个结构。

CeWriteRecordProps();//数据写入EDB

创建一个CEPROPVAL对象,或对象数组,将所要写入的数据传给这些对象。

CeSeekDatabaseEx();//定位要删除的数据

CeDeleteRecord();//删除定位的数据

CeWriteRecordProps();//数据写入新数据到EDB覆盖原数据

CloseHandle(打开时的句柄);

3.其他的一些数据库操作函数

列举数据库: CeFindFirstDatabaseEx和CeFindNextDatabase

获得数据库的信息:CeOidGetInfoEx

//在EDB的消息函数中用到

释放通告消息结构体:CeFreeNotification

将数据缓冲到flash上:CeFreeNotification

获得打开的数据库所使用的句柄:CeGetDBInformationByHandle

设置数据库的各种参数:CeSetDatabaseInfoEx

列举所有转载的数据库卷并返回卷名:CeEnumDBVolumes

三、以下是EDB代码示例 

  1. CEOID oid = NULL; 
  2. CEGUID guidVol = {0,}; 
  3. BOOL fOK = true
  4. HANDLE h = INVALID_HANDLE_VALUE; 
  5. LPWSTR lpwszDBVol = L"volume.db"
  6. ORTORDERSPECEX s = 
  7. 2, // wVersion should be 2 for EDB 
  8. 1, // wNumProps 
  9. 0, // wKeyFlags 
  10. 0, // wReserved 
  11. 0, //rgPropID, 
  12. { 0 } //rgdwFlags 
  13. }; 
  14.  
  15.  
  16. CEDBASEINFOEX info = 
  17. 2, // wVersion must be 2 for EDB 
  18. 0, // wNumSortOrder 
  19. (CEDB_VALIDNAME | CEDB_VALIDTYPE | CEDB_VALIDSORTSPEC), // dwFlags 
  20. L"Table1"// szDbaseName 
  21. 0x777, // dwDbaseType 
  22. 4,/*NULL, // dwNumRecords*/ 
  23. NULL, // dwSize (Not used by EDB) 
  24. {0,}, //ftLastModified (Not used by EDB) 
  25. }; 
  26.  
  27. CEPROPVAL val = 
  28. 0,    // propid 
  29. NULL, // wLenData - can be garbage on entry 
  30. NULL, // wFlags 
  31. 0   
  32. }; 
  33.  
  34. s.rgPropID[0] = CEVT_LPWSTR; 
  35. val.propid = CEVT_LPWSTR; 
  36.  
  37. CEPROPSPEC CEPropSpec[4]; 
  38. CEPropSpec[0].wVersion = 1; 
  39. CEPropSpec[0].propid = CEVT_LPWSTR; 
  40. CEPropSpec[0].dwFlags = 0; 
  41. CEPropSpec[0].pwszPropName = TEXT("Name"); 
  42. CEPropSpec[0].cchPropName = CEDB_MAXDBASENAMELEN; 
  43.  
  44. // The Following . 
  45. CEPropSpec[1].wVersion = 1; 
  46. CEPropSpec[1].propid = CEVT_LPWSTR; 
  47. CEPropSpec[1].dwFlags = 0; 
  48. CEPropSpec[1].pwszPropName = TEXT("Phone"); 
  49. CEPropSpec[1].cchPropName = CEDB_MAXDBASENAMELEN; 
  50.  
  51. // The Following . 
  52. CEPropSpec[2].wVersion = 1; 
  53. CEPropSpec[2].propid = CEVT_LPWSTR; 
  54. CEPropSpec[2].dwFlags = 0;//0; 
  55. CEPropSpec[2].pwszPropName = TEXT("Content"); 
  56. CEPropSpec[2].cchPropName = CEDB_MAXDBASENAMELEN; 
  57.  
  58. // The Following . 
  59. CEPropSpec[3].wVersion = 1; 
  60. CEPropSpec[3].propid = CEVT_LPWSTR; 
  61. CEPropSpec[3].dwFlags = 0;//0; 
  62. CEPropSpec[3].pwszPropName = TEXT("Isread"); 
  63. CEPropSpec[3].cchPropName = CEDB_MAXDBASENAMELEN; 
  64.  
  65. if (!CeMountDBVolEx(&guidVol, lpwszDBVol, NULL, CREATE_ALWAYS)) 
  66. fOK = false
  67. goto exit; 
  68.  
  69. if((oid=CeCreateDatabaseWithProps(&guidVol,&info,0,CEPropSpec))==NULL) 
  70. {
  71. fOK = false;
  72. goto exit;
  73. }
  74.  
  75. if ((h = CeOpenDatabaseInSession(NULL, &guidVol, &oid, NULL, NULL, 
  76. 0, NULL)) == INVALID_HANDLE_VALUE) 
  77. fOK = false
  78. goto exit; 
  79.  
  80. CEPROPVAL pProp[4]; 
  81. pProp[0].propid = PID_NAME; 
  82. pProp[0].wFlags = 0; 
  83. pProp[0].wLenData = 0; 
  84. pProp[0].val.lpwstr = L"777rewr"
  85. pProp[1].propid = PID_PHONE; 
  86. pProp[1].wFlags = 0; 
  87. pProp[1].wLenData = 0; 
  88. pProp[1].val.lpwstr = L"888rer"
  89. pProp[2].propid = PID_CONTENT; 
  90. pProp[2].wFlags = 0; 
  91. pProp[2].wLenData = 0; 
  92. pProp[2].val.lpwstr = L"123rewr"
  93. pProp[3].propid = PID_ISREADED; 
  94. pProp[3].wFlags = 0; 
  95. pProp[3].wLenData = 0; 
  96. pProp[3].val.lpwstr = L"234rewr"
  97.  
  98. //Write records. 
  99. for(int i = 0; i < 100; ++i) 
  100. oid = CeWriteRecordProps(h, 0, 4, pProp); 
  101.  
  102. //Add records. 
  103. CeWriteRecordProps(h, 0, 4, pProp); 
  104. CeFlushDBVol(&guidVol); // Just being paranoid! 
  105. CloseHandle(h); 
  106. exit: 
  107. CeUnmountDBVol(&guidVol); 

查找及删除操作示例:

  1. bool fOK = true
  2. CEOID oid = NULL; 
  3. CEOID oidRow = NULL; 
  4. CEGUID guidVol; 
  5. HANDLE h = INVALID_HANDLE_VALUE; 
  6. HANDLE    hDBOpened = NULL; 
  7. CREATE_INVALIDGUID(&guidVol); 
  8.  
  9. if (!CeMountDBVolEx(&guidVol, L"volume.db", NULL, OPEN_EXISTING)) 
  10. fOK = false
  11. MessageBox(L"Err!!!"); 
  12.  
  13. // Open Database by Name to get its oid. 
  14. if ((h = CeOpenDatabaseInSession(NULL, &guidVol, &oid, L"Table1", NULL, 
  15. CEDB_AUTOINCREMENT, NULL)) == INVALID_HANDLE_VALUE) 
  16. fOK = false
  17. MessageBox(L"Err!!!"); 
  18.  
  19. CEOIDINFOEX ceoidInfoEx; 
  20. memset(&ceoidInfoEx,0,sizeof(CEOIDINFOEX)); 
  21. ceoidInfoEx.wVersion = 2; 
  22. // if (!CeOidGetInfoEx2(&guidVol, oid, &ceoidInfoEx)) 
  23. // { 
  24. //   DWORD err = GetLastError(); 
  25. //   MessageBox(_T("CeOidGetInfoEx2 error!!!")); 
  26. // }   
  27. //   
  28. // int Leng = ceoidInfoEx.infDatabase.dwNumRecords; 
  29. // CString cs; 
  30. // cs.Format(L"%d",Leng); 
  31. // MessageBox(cs); 
  32.  
  33. CeSeekDatabaseEx(h, CEDB_SEEK_BEGINNING, 0, 0, NULL); 
  34.  
  35. WORD          dwPropId = 0; 
  36. DWORD         dwSizeOfBuffer = 0; 
  37. CEOID         ceoidFindRecord = 0; 
  38. WORD          wNumRecProps = 0; 
  39. LPBYTE        lpRecProps = NULL; 
  40. PCEPROPVAL    pCePropVal = NULL; 
  41. DWORD         dwBufLen = 256; 
  42. BOOL m_bFlag = FALSE; 
  43. int m_iCount = 0; 
  44.  
  45. while(ceoidFindRecord = CeReadRecordPropsEx(h, 
  46. CEDB_ALLOWREALLOC, &dwPropId, NULL, &lpRecProps, &dwSizeOfBuffer, NULL)) 
  47. if(GetLastError() != ERROR_NO_MORE_ITEMS) 
  48.    pCePropVal = (PCEPROPVAL)lpRecProps; 
  49.    LPWSTR lpnum; 
  50.    if (m_iCount%2) 
  51.     lpnum = pCePropVal[3].val.lpwstr; 
  52.    else 
  53.     lpnum = pCePropVal[1].val.lpwstr; 
  54.  
  55. TRACE(L"%d=%s\n",m_iCount,lpnum); 
  56.  
  57.    ++m_iCount; 
  58.    if(!lpnum ) 
  59.    { 
  60.     CeDeleteRecord(h, ceoidFindRecord); 
  61.     m_bFlag = FALSE; 
  62.    } 
  63.    else 
  64.     m_bFlag = TRUE; 
  65.  
  66. CString str; 
  67. str.Format(L"%d",m_iCount); 
  68. MessageBox(str); 
  69.  
  70. if (h) 
  71. CloseHandle(h); 
  72.  
  73. if(&guidVol) 
  74. CeFlushDBVol(&guidVol); 
  75. CeUnmountDBVol(&guidVol); 

头文件:

  1. extern "C" 
  2. #include <windbase_edb.h> 
  3. #define EDB 

Windows mobile 5.0系统中操纵EDB

WM5以前的系统中一般都是使用的CEDB数据库,EDB是WM5中的新特性之一。为了改善应用程序的性能和长期可移植性,CEDB 已经被 EDB 所取代。EDB 利用了 SQL Mobile 使用的存储子系统,并且提供了明显优于 CEDB 的性能(尤其是在与持久存储区一起使用时)。因为 CEDB 提供了与 EDB 完全相同的函数集 ,所有函数都具有相同的名称和参数列表。但是EDB中也包含了CEDB中所没有函数,并且创建方法也不相同了,要比CEDB复杂。以下就是EDB的创建和使用法:

一。创建:

1。CeMountDBVol( );//创建卷

2。CeCreateDatabaseWithProps();//卷创建成功后创建EDB

3。CeCreateSession();//EDB创建成功后创建session,用于打开EDB

4。CeOpenDatabaseInSession();//打开EDB

创建EDB时前还要创建一个CEDBASEINFOEX对象,这个对象用于创建EDB中的info,用于设定EDB。

在打开时还要维护一个全局的HANDLE,在以后的操作中是要使用的

二。选择数据

1。CeSeekDatabaseEx();//定位所要找的数据

2。CeReadRecordPropsEx();//读出定位的数据

创建一个CEPROPVAL对象,将所要定位数据的条件传给这个结构。

三。插入数据

CeWriteRecordProps();//数据写入EDB

创建一个CEPROPVAL对象,或对象数组,将所要写入的数据传给这些对象。

四。删除数据

1。CeSeekDatabaseEx();//定位要删除的数据

2。CeDeleteRecord();//删除定位的数据

五。更新数据

所插入数据基本相同,就是将已有数据覆盖

1。CeSeekDatabaseEx();//定位所要找的数据

2。CeWriteRecordProps();//数据写入新数据到EDB覆盖原数据

六。关闭EDB

CloseHandle(打开时的句柄);

在这里关键是创建EDB时所选的参数,和对结构体的使用,这样才能正确定位数据,否则选择、更新、删除都无法实现。

from:http://blog.csdn.net/sc_valentine21/archive/2008/11/07/3245904.aspx

(sc_valentine21)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201012/10569.html]
本文出处:CSDN博客 作者:sc_valentine21
顶一下
(1)
100%
踩一下
(0)
0%
------分隔线----------------------------
相关文章
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容