EDB資料庫的操作

來源:互聯網
上載者:User

一、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程式碼範例

  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.  SORTORDERSPECEX s = 
  7.  {
  8.   2, // wVersion should be 2 for EDB
  9.   1, // wNumProps
  10.   0, // wKeyFlags
  11.   0, // wReserved
  12.   0, //rgPropID,
  13.   { 0 } //rgdwFlags
  14.  };
  15.  CEDBASEINFOEX info = 
  16.  { 
  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.  CEPROPVAL val = 
  27.  {
  28.   0,    // propid
  29.   NULL, // wLenData - can be garbage on entry
  30.   NULL, // wFlags
  31.   0  
  32.  };
  33.  s.rgPropID[0] = CEVT_LPWSTR;
  34.  val.propid = CEVT_LPWSTR;
  35.  CEPROPSPEC CEPropSpec[4];
  36.  CEPropSpec[0].wVersion = 1;
  37.  CEPropSpec[0].propid = CEVT_LPWSTR;
  38.  CEPropSpec[0].dwFlags = 0;
  39.  CEPropSpec[0].pwszPropName = TEXT("Name");
  40.  CEPropSpec[0].cchPropName = CEDB_MAXDBASENAMELEN;
  41.  // The Following .
  42.  CEPropSpec[1].wVersion = 1;
  43.  CEPropSpec[1].propid = CEVT_LPWSTR;
  44.  CEPropSpec[1].dwFlags = 0;
  45.  CEPropSpec[1].pwszPropName = TEXT("Phone");
  46.  CEPropSpec[1].cchPropName = CEDB_MAXDBASENAMELEN;
  47.  // The Following .
  48.  CEPropSpec[2].wVersion = 1;
  49.  CEPropSpec[2].propid = CEVT_LPWSTR;
  50.  CEPropSpec[2].dwFlags = 0;//0;
  51.  CEPropSpec[2].pwszPropName = TEXT("Content");
  52.  CEPropSpec[2].cchPropName = CEDB_MAXDBASENAMELEN;
  53.  // The Following .
  54.  CEPropSpec[3].wVersion = 1;
  55.  CEPropSpec[3].propid = CEVT_LPWSTR;
  56.  CEPropSpec[3].dwFlags = 0;//0;
  57.  CEPropSpec[3].pwszPropName = TEXT("Isread");
  58.  CEPropSpec[3].cchPropName = CEDB_MAXDBASENAMELEN;
  59.  if (!CeMountDBVolEx(&guidVol, lpwszDBVol, NULL, CREATE_ALWAYS))
  60.  {
  61.   fOK = false;
  62.   goto exit;
  63.  }
  64.  if ((oid = CeCreateDatabaseWithProps(&guidVol, &info, 0, CEPropSpec)) == NULL)
  65.  {
  66.   fOK = false;
  67.   goto exit;
  68.  }
  69.  if ((h = CeOpenDatabaseInSession(NULL, &guidVol, &oid, NULL, NULL,
  70.   0, NULL)) == INVALID_HANDLE_VALUE)
  71.  {
  72.   fOK = false;
  73.   goto exit;
  74.  }
  75.  CEPROPVAL pProp[4];
  76.  pProp[0].propid = PID_NAME;
  77.  pProp[0].wFlags = 0;
  78.  pProp[0].wLenData = 0;
  79.  pProp[0].val.lpwstr = L"777rewr";
  80.  pProp[1].propid = PID_PHONE;
  81.  pProp[1].wFlags = 0;
  82.  pProp[1].wLenData = 0;
  83.  pProp[1].val.lpwstr = L"888rer";
  84.  pProp[2].propid = PID_CONTENT;
  85.  pProp[2].wFlags = 0;
  86.  pProp[2].wLenData = 0;
  87.  pProp[2].val.lpwstr = L"123rewr";
  88.  pProp[3].propid = PID_ISREADED;
  89.  pProp[3].wFlags = 0;
  90.  pProp[3].wLenData = 0;
  91.  pProp[3].val.lpwstr = L"234rewr";
  92.  //Write records.
  93.  for(int i = 0; i < 100; ++i)
  94.   oid = CeWriteRecordProps(h, 0, 4, pProp);
  95.  //Add records.
  96.  CeWriteRecordProps(h, 0, 4, pProp);
  97.  CeFlushDBVol(&guidVol); // Just being paranoid!
  98.  CloseHandle(h);
  99. exit:
  100.  CeUnmountDBVol(&guidVol);
  101. 尋找及刪除操作樣本:
  102. bool fOK = true;
  103.  CEOID oid = NULL; 
  104.  CEOID oidRow = NULL;
  105.  CEGUID guidVol;
  106.  HANDLE h = INVALID_HANDLE_VALUE;
  107.  HANDLE    hDBOpened = NULL;
  108.  CREATE_INVALIDGUID(&guidVol);
  109.  if (!CeMountDBVolEx(&guidVol, L"volume.db", NULL, OPEN_EXISTING))
  110.  {
  111.   fOK = false;
  112.   MessageBox(L"Err!!!");
  113.  }
  114.  // Open Database by Name to get its oid.
  115.  if ((h = CeOpenDatabaseInSession(NULL, &guidVol, &oid, L"Table1", NULL,
  116.   CEDB_AUTOINCREMENT, NULL)) == INVALID_HANDLE_VALUE)
  117.  {
  118.   fOK = false;
  119.   MessageBox(L"Err!!!");
  120.  }
  121.  CEOIDINFOEX ceoidInfoEx;
  122.  memset(&ceoidInfoEx,0,sizeof(CEOIDINFOEX));
  123.  ceoidInfoEx.wVersion = 2;
  124. //  if (!CeOidGetInfoEx2(&guidVol, oid, &ceoidInfoEx)) 
  125. //  {
  126. //   DWORD err = GetLastError(); 
  127. //   MessageBox(_T("CeOidGetInfoEx2  error!!!")); 
  128. //  }  
  129. //  
  130. //  int Leng = ceoidInfoEx.infDatabase.dwNumRecords;
  131. //  CString cs;
  132. //  cs.Format(L"%d",Leng);
  133. //  MessageBox(cs);
  134.  CeSeekDatabaseEx(h, CEDB_SEEK_BEGINNING, 0, 0, NULL);
  135.  WORD          dwPropId = 0;
  136.  DWORD         dwSizeOfBuffer = 0;
  137.  CEOID         ceoidFindRecord = 0;
  138.  WORD          wNumRecProps = 0; 
  139.  LPBYTE        lpRecProps = NULL; 
  140.  PCEPROPVAL    pCePropVal = NULL;
  141.  DWORD         dwBufLen = 256;
  142.  BOOL m_bFlag = FALSE;
  143.  int m_iCount = 0;
  144.  while(ceoidFindRecord = CeReadRecordPropsEx(h, CEDB_ALLOWREALLOC, &dwPropId, NULL, &lpRecProps, &dwSizeOfBuffer, NULL))
  145.  {
  146.   if(GetLastError() != ERROR_NO_MORE_ITEMS)
  147.   {
  148.    pCePropVal = (PCEPROPVAL)lpRecProps;
  149.    LPWSTR lpnum;
  150.    if (m_iCount%2)
  151.     lpnum = pCePropVal[3].val.lpwstr;
  152.    else
  153.     lpnum = pCePropVal[1].val.lpwstr;
  154.   TRACE(L"%d=%s/n",m_iCount,lpnum);
  155.    ++m_iCount;
  156.    if(!lpnum )
  157.    {
  158.     CeDeleteRecord(h, ceoidFindRecord);
  159.     m_bFlag = FALSE;
  160.    }
  161.    else
  162.     m_bFlag = TRUE;
  163.   } 
  164.  }
  165.  CString str;
  166.  str.Format(L"%d",m_iCount);
  167.  MessageBox(str);
  168.  if (h)
  169.   CloseHandle(h);
  170.  if(&guidVol)
  171.  {
  172.   CeFlushDBVol(&guidVol);
  173.   CeUnmountDBVol(&guidVol);
  174.  }
  175. 標頭檔:extern "C"
  176. {
  177. #include <windbase_edb.h>
  178. }
  179. #define EDB

 
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.