Benjamin

静以修身,俭以养德,非澹薄无以明志,非宁静无以致远。
随笔 - 345, 文章 - 0, 评论 - 196, 引用 - 0
数据加载中……

EDB数据库的操作

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

二、EDB数据库的创建和基本操作
1.创建数据库卷:CeMountDBVol( );//创建卷
CeCreateDatabaseWithProps();//卷创建成功后创建EDB
CeCreateSession();//EDB创建成功后创建session,用于打开EDB
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代码示例
 CEOID oid = NULL;
 CEGUID guidVol = {0,};
 BOOL fOK = true;
 HANDLE h = INVALID_HANDLE_VALUE;
 LPWSTR lpwszDBVol = L"volume.db";

 SORTORDERSPECEX s =
 {
  2, // wVersion should be 2 for EDB
  1, // wNumProps
  0, // wKeyFlags
  0, // wReserved
  0, //rgPropID,
  { 0 } //rgdwFlags
 };

 CEDBASEINFOEX info =
 {
  2, // wVersion must be 2 for EDB
  0, // wNumSortOrder
  (CEDB_VALIDNAME | CEDB_VALIDTYPE | CEDB_VALIDSORTSPEC), // dwFlags
  L"Table1", // szDbaseName
  0x777, // dwDbaseType
  4,/*NULL, // dwNumRecords*/
  NULL, // dwSize (Not used by EDB)
  {0,}, //ftLastModified (Not used by EDB)
 };

 CEPROPVAL val =
 {
  0,    // propid
  NULL, // wLenData - can be garbage on entry
  NULL, // wFlags
  0 
 };

 s.rgPropID[0] = CEVT_LPWSTR;
 val.propid = CEVT_LPWSTR;


 CEPROPSPEC CEPropSpec[4];
 CEPropSpec[0].wVersion = 1;
 CEPropSpec[0].propid = CEVT_LPWSTR;
 CEPropSpec[0].dwFlags = 0;
 CEPropSpec[0].pwszPropName = TEXT("Name");
 CEPropSpec[0].cchPropName = CEDB_MAXDBASENAMELEN;


 // The Following .
 CEPropSpec[1].wVersion = 1;
 CEPropSpec[1].propid = CEVT_LPWSTR;
 CEPropSpec[1].dwFlags = 0;
 CEPropSpec[1].pwszPropName = TEXT("Phone");
 CEPropSpec[1].cchPropName = CEDB_MAXDBASENAMELEN;

 // The Following .
 CEPropSpec[2].wVersion = 1;
 CEPropSpec[2].propid = CEVT_LPWSTR;
 CEPropSpec[2].dwFlags = 0;//0;
 CEPropSpec[2].pwszPropName = TEXT("Content");
 CEPropSpec[2].cchPropName = CEDB_MAXDBASENAMELEN;

 // The Following .
 CEPropSpec[3].wVersion = 1;
 CEPropSpec[3].propid = CEVT_LPWSTR;
 CEPropSpec[3].dwFlags = 0;//0;
 CEPropSpec[3].pwszPropName = TEXT("Isread");
 CEPropSpec[3].cchPropName = CEDB_MAXDBASENAMELEN;

 if (!CeMountDBVolEx(&guidVol, lpwszDBVol, NULL, CREATE_ALWAYS))
 {
  fOK = false;
  goto exit;
 }

 if ((oid = CeCreateDatabaseWithProps(&guidVol, &info, 0, CEPropSpec)) == NULL)
 {
  fOK = false;
  goto exit;
 }


 if ((h = CeOpenDatabaseInSession(NULL, &guidVol, &oid, NULL, NULL,
  0, NULL)) == INVALID_HANDLE_VALUE)
 {
  fOK = false;
  goto exit;
 }

 CEPROPVAL pProp[4];
 pProp[0].propid = PID_NAME;
 pProp[0].wFlags = 0;
 pProp[0].wLenData = 0;
 pProp[0].val.lpwstr = L"777rewr";

 pProp[1].propid = PID_PHONE;
 pProp[1].wFlags = 0;
 pProp[1].wLenData = 0;
 pProp[1].val.lpwstr = L"888rer";

 pProp[2].propid = PID_CONTENT;
 pProp[2].wFlags = 0;
 pProp[2].wLenData = 0;
 pProp[2].val.lpwstr = L"123rewr";

 pProp[3].propid = PID_ISREADED;
 pProp[3].wFlags = 0;
 pProp[3].wLenData = 0;
 pProp[3].val.lpwstr = L"234rewr";

 //Write records.
 for(int i = 0; i < 100; ++i)
  oid = CeWriteRecordProps(h, 0, 4, pProp);

 //Add records.
 CeWriteRecordProps(h, 0, 4, pProp);

 

 CeFlushDBVol(&guidVol); // Just being paranoid!
 CloseHandle(h);


exit:

 CeUnmountDBVol(&guidVol);

查找及删除操作示例:
bool fOK = true;
 CEOID oid = NULL;
 CEOID oidRow = NULL;
 CEGUID guidVol;
 HANDLE h = INVALID_HANDLE_VALUE;
 HANDLE    hDBOpened = NULL;

 CREATE_INVALIDGUID(&guidVol);

 if (!CeMountDBVolEx(&guidVol, L"volume.db", NULL, OPEN_EXISTING))
 {
  fOK = false;
  MessageBox(L"Err!!!");
 }

 
 // Open Database by Name to get its oid.
 if ((h = CeOpenDatabaseInSession(NULL, &guidVol, &oid, L"Table1", NULL,
  CEDB_AUTOINCREMENT, NULL)) == INVALID_HANDLE_VALUE)
 {
  fOK = false;
  MessageBox(L"Err!!!");
 }

 CEOIDINFOEX ceoidInfoEx;
 memset(&ceoidInfoEx,0,sizeof(CEOIDINFOEX));
 ceoidInfoEx.wVersion = 2;

//  if (!CeOidGetInfoEx2(&guidVol, oid, &ceoidInfoEx))
//  {
//   DWORD err = GetLastError();
//   MessageBox(_T("CeOidGetInfoEx2  error!!!"));
//  } 
//  
//  int Leng = ceoidInfoEx.infDatabase.dwNumRecords;
//  CString cs;
//  cs.Format(L"%d",Leng);
//  MessageBox(cs);

 CeSeekDatabaseEx(h, CEDB_SEEK_BEGINNING, 0, 0, NULL);

 WORD          dwPropId = 0;
 DWORD         dwSizeOfBuffer = 0;
 CEOID         ceoidFindRecord = 0;
 WORD          wNumRecProps = 0;
 LPBYTE        lpRecProps = NULL;
 PCEPROPVAL    pCePropVal = NULL;
 DWORD         dwBufLen = 256;
 BOOL m_bFlag = FALSE;
 
 int m_iCount = 0;
 while(ceoidFindRecord = CeReadRecordPropsEx(h, CEDB_ALLOWREALLOC, &dwPropId, NULL, &lpRecProps, &dwSizeOfBuffer, NULL))
 {
  if(GetLastError() != ERROR_NO_MORE_ITEMS)
  {
   pCePropVal = (PCEPROPVAL)lpRecProps;
   LPWSTR lpnum;
   if (m_iCount%2)
    lpnum = pCePropVal[3].val.lpwstr;
   else
    lpnum = pCePropVal[1].val.lpwstr;


  TRACE(L"%d=%s\n",m_iCount,lpnum);
 
   ++m_iCount;
   if(!lpnum )
   {
    CeDeleteRecord(h, ceoidFindRecord);
    m_bFlag = FALSE;
   }
   else
    m_bFlag = TRUE;
  } 
 }
 CString str;
 str.Format(L"%d",m_iCount);
 MessageBox(str);

 if (h)
  CloseHandle(h);

 if(&guidVol)
 {
  CeFlushDBVol(&guidVol);
  CeUnmountDBVol(&guidVol);
 }

头文件:extern "C"
{
#include <windbase_edb.h>
}

#define EDB

 

posted on 2008-08-11 13:20 Benjamin 阅读(3136) 评论(0)  编辑 收藏 引用 所属分类: PDA/PPC开发


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理