一、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