EDB的简单使用

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

要使用EDB,首先就是mount

BOOL CeMountDBVol(

  PCEGUID pceguid,

  LPWSTR lpszDBVol,

  DWORD dwFlags

);

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

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

CEOID CeCreateDatabaseWithProps(

  PCEGUID pGuid,

  CEDBASEINFOEX* pInfo,

  DWORD cProps,

  CEPROPSPEC* prgProps

);

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

CEDBASEINFOEX的定义如下:

typedef struct CEDBASEINFOEX {

  WORD wVersion;

  WORD wNumSortOrder;

  DWORD dwFlags;

  WCHAR szDbaseName[CEDB_MAXDBASENAMELEN];

  DWORD dwDbaseType;

  DWORD dwNumRecords;

  DWORD dwSize;

  FILETIME ftLastModified;

  SORTORDERSPECEX rgSortSpecs[CEDB_MAXSORTORDER];

} CEDBASEINFOEX;

 

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

CEDBASEINFOEX       dbInfo = {0};

       dbInfo.wVersion = CEDBASEINFOEX_VERSION;

       dbInfo.dwFlags = CEDB_VALIDDBFLAGS | CEDB_VALIDNAME | CEDB_VALIDSORTSPEC;

       dbInfo.wNumSortOrder = 1;

       _tcscpy(dbInfo.szDbaseName, szDbname);

 

       dbInfo.rgSortSpecs[0].wVersion = SORTORDERSPECEX_VERSION;

       dbInfo.rgSortSpecs[0].wNumProps = 1;

       dbInfo.rgSortSpecs[0].wKeyFlags = 0;

       dbInfo.rgSortSpecs[0].rgPropID[0] = PROP_NAME;

       dbInfo.rgSortSpecs[0].rgdwFlags[0] = CEDB_SORT_UNKNOWNFIRST;

 

       dbInfo.rgSortSpecs[1].wVersion = SORTORDERSPECEX_VERSION;

       dbInfo.rgSortSpecs[1].wNumProps = 1;

       dbInfo.rgSortSpecs[1].wKeyFlags = 0;

       dbInfo.rgSortSpecs[1].rgPropID[0] = PROP_AGE;

       dbInfo.rgSortSpecs[1].rgdwFlags[0] = CEDB_SORT_UNKNOWNFIRST;

       CeCreateDatabaseWithProps(&g_VolGuid, &dbInfo, 0, NULL);

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

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

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

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

CeWriteRecordProps的定义如下:


CEOID CeWriteRecordProps(

  HANDLE hDatabase,

  CEOID oidRecord,

  WORD cPropID,

  CEPROPVAL* prgPropVal

);

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

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

prop[0].propid = PROP_NAME;

       prop[0].val.lpwstr = _T("某某");

       prop[0].wFlags = 0;

 

       prop[1].propid = PROP_AGE;

       prop[1].val.uiVal = 25;

       prop[1].wFlags = 0;

 

       CeWriteRecordProps(hdb, 0, 2, prop);

 

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

它的定义如下:

CEOID CeReadRecordPropsEx(

  HANDLE hDatabase,

  DWORD dwFlags,

  LPWORD lpcPropID,

  CEPROPID* prgPropID,

  LPBYTE lplpBuffer,

  LPDWORD lpcbBuffer,

  HANDLE hHeap

);

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

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

 

下面贴上简单的代码

  1. #define EDB
  2. #include <Windows.h>
  3. #include <windbase.h>
  4. #ifndef EDB 
  5. #include <windbase_edb.h> 
  6. #endif 
  7. #define MAKEPROP(n,t)    ((n<<16)|CEVT_##t)
  8. #define     PROP_NAME   MAKEPROP(10, LPWSTR)
  9. #define     PROP_AGE    MAKEPROP(10, UI2)
  10. CEGUID  g_VolGuid;
  11. LPTSTR  szDbname = _T("MyMsgDb");
  12. LPTSTR  szDbVol = _T("Test.edb");
  13. HANDLE  g_hSession;
  14. BOOL    CreateMyDB();
  15. BOOL    WriteMyDB(HANDLE hdb);
  16. BOOL    OpenDB(HANDLE *phDB);
  17. BOOL    ReadMyDB(HANDLE hDb);
  18. int WINAPI WinMain(HINSTANCE hInstance,
  19.                    HINSTANCE hPrevInstance,
  20.                    LPTSTR    lpCmdLine,
  21.                    int       nCmdShow)
  22. {
  23.     if (FALSE == CreateMyDB())
  24.         return  FALSE;
  25.     
  26.     HANDLE  hDb;
  27.     OpenDB(&hDb);
  28.     //CeSeekDatabaseEx(hDb, CEDB_SEEK_BEGINNING, 0, 0, 0);
  29.     WriteMyDB(hDb);
  30.     CloseHandle(hDb);
  31.     CEOID   DBoid = 0;
  32.     hDb = CeOpenDatabaseInSession( g_hSession, 
  33.         &g_VolGuid, 
  34.         &DBoid, 
  35.         szDbname, 
  36.         NULL, 
  37.         0,
  38.         NULL);
  39.     CeSeekDatabaseEx(hDb, CEDB_SEEK_BEGINNING, 0, 0, 0);
  40.     ReadMyDB(hDb);
  41.     CloseHandle(hDb);
  42.     return  0;
  43. }
  44. BOOL CreateMyDB()
  45. {
  46.     CREATE_SYSTEMGUID(&g_VolGuid);
  47.     
  48.     CEDBASEINFOEX   dbInfo = {0};
  49.     dbInfo.wVersion = CEDBASEINFOEX_VERSION;
  50.     dbInfo.dwFlags = CEDB_VALIDDBFLAGS | CEDB_VALIDNAME | CEDB_VALIDSORTSPEC;
  51.     dbInfo.wNumSortOrder = 1;
  52.     _tcscpy(dbInfo.szDbaseName, szDbname);
  53.     dbInfo.rgSortSpecs[0].wVersion = SORTORDERSPECEX_VERSION;
  54.     dbInfo.rgSortSpecs[0].wNumProps = 1;
  55.     dbInfo.rgSortSpecs[0].wKeyFlags = 0;
  56.     dbInfo.rgSortSpecs[0].rgPropID[0] = PROP_NAME;
  57.     dbInfo.rgSortSpecs[0].rgdwFlags[0] = CEDB_SORT_UNKNOWNFIRST;
  58.     dbInfo.rgSortSpecs[1].wVersion = SORTORDERSPECEX_VERSION;
  59.     dbInfo.rgSortSpecs[1].wNumProps = 1;
  60.     dbInfo.rgSortSpecs[1].wKeyFlags = 0;
  61.     dbInfo.rgSortSpecs[1].rgPropID[0] = PROP_AGE;
  62.     dbInfo.rgSortSpecs[1].rgdwFlags[0] = CEDB_SORT_UNKNOWNFIRST;
  63.     if (!CeMountDBVol(&g_VolGuid, szDbVol, CREATE_ALWAYS | EDB_MOUNT_FLAG))
  64.     {
  65.         DWORD   dd = GetLastError();
  66.         return  FALSE;
  67.     }
  68.     CEOID   DBOid = 0;
  69.     if(NULL == (DBOid = CeCreateDatabaseWithProps(&g_VolGuid, &dbInfo, 0, NULL)))
  70.     {
  71.         DWORD   dd = GetLastError();
  72.         return  FALSE;
  73.     }
  74.     return  TRUE;
  75. }
  76. BOOL WriteMyDB(HANDLE hdb)
  77. {
  78.     CEPROPVAL prop[2] = {0};
  79.     prop[0].propid = PROP_NAME;
  80.     prop[0].val.lpwstr = _T("猛哥");
  81.     prop[0].wFlags = 0;
  82.     prop[1].propid = PROP_AGE;
  83.     prop[1].val.uiVal = 24;
  84.     prop[1].wFlags = 0;
  85.     CeWriteRecordProps(hdb, 0, 2, prop);
  86.     prop[0].propid = PROP_NAME;
  87.     prop[0].val.lpwstr = _T("某某");
  88.     prop[0].wFlags = 0;
  89.     prop[1].propid = PROP_AGE;
  90.     prop[1].val.uiVal = 25;
  91.     prop[1].wFlags = 0;
  92.     CeWriteRecordProps(hdb, 0, 2, prop);
  93.     CeFlushDBVol(&g_VolGuid);
  94.     return  TRUE;
  95. }
  96. BOOL OpenDB(HANDLE *phDB)
  97. {
  98.     CEOID DBOid=0;
  99.     g_hSession = CeCreateSession(&g_VolGuid);
  100.     *phDB = CeOpenDatabaseInSession( g_hSession, 
  101.         &g_VolGuid, 
  102.         &DBOid, 
  103.         szDbname, 
  104.         NULL, 
  105.         CEDB_AUTOINCREMENT,
  106.         NULL);
  107.     return  TRUE;
  108. }
  109. BOOL ReadMyDB(HANDLE hDb)
  110. {
  111.     CEOID oidRecord = 0;
  112.     WORD    wNumProps = 0;
  113.     CEPROPVAL *pRecord = NULL;
  114.     DWORD   dwBufSize = 0;
  115.     while (oidRecord = CeReadRecordPropsEx(hDb, CEDB_ALLOWREALLOC, &wNumProps, NULL, (LPBYTE *)&pRecord, &dwBufSize, NULL))
  116.     {
  117.         for (int i = 0; i < wNumProps; i++) {
  118.             switch(pRecord[i].propid) 
  119.             {
  120.             case    PROP_NAME:
  121.                 break;
  122.             case    PROP_ID:
  123.                 break;
  124.             }
  125.     }
  126.     return  TRUE;
  127. }

 

(刚学edb,可能会有好多错误,希望大家提出批评指正)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值