• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Benjamin

            靜以修身,儉以養(yǎng)德,非澹薄無以明志,非寧靜無以致遠(yuǎn)。
            隨筆 - 397, 文章 - 0, 評論 - 196, 引用 - 0
            數(shù)據(jù)加載中……

            EDB數(shù)據(jù)庫的操作

            一、WM5以前的系統(tǒng)中一般都是使用的CEDB數(shù)據(jù)庫,EDB是WM5中的新特性之一。為了改善應(yīng)用程序的性能和長期可移植性,CEDB 已經(jīng)被 EDB 所取代。EDB 利用了 SQL Mobile 使用的存儲子系統(tǒng),并且提供了明顯優(yōu)于 CEDB 的性能(尤其是在與持久存儲區(qū)一起使用時)。因為 CEDB 提供了與 EDB 完全相同的函數(shù)集 ,所有函數(shù)都具有相同的名稱和參數(shù)列表。但是EDB中也包含了CEDB中所沒有函數(shù),并且創(chuàng)建方法也不相同了,要比CEDB復(fù)雜。

            二、EDB數(shù)據(jù)庫的創(chuàng)建和基本操作
            1.創(chuàng)建數(shù)據(jù)庫卷:CeMountDBVol( );//創(chuàng)建卷
            CeCreateDatabaseWithProps();//卷創(chuàng)建成功后創(chuàng)建EDB
            CeCreateSession();//EDB創(chuàng)建成功后創(chuàng)建session,用于打開EDB
            CeOpenDatabaseInSession();//打開EDB
            創(chuàng)建EDB時前還要創(chuàng)建一個CEDBASEINFOEX對象,這個對象用于創(chuàng)建EDB中的info,用于設(shè)定EDB。
            在打開時還要維護(hù)一個全局的HANDLE,在以后的操作中是要使用的.
            2.對數(shù)據(jù)庫進(jìn)行讀,寫,刪除的操作
            CeSeekDatabaseEx();//定位所要找的數(shù)據(jù)
            CeReadRecordPropsEx();//讀出定位的數(shù)據(jù)
            創(chuàng)建一個CEPROPVAL對象,將所要定位數(shù)據(jù)的條件傳給這個結(jié)構(gòu)。
            CeWriteRecordProps();//數(shù)據(jù)寫入EDB
            創(chuàng)建一個CEPROPVAL對象,或?qū)ο髷?shù)組,將所要寫入的數(shù)據(jù)傳給這些對象。
            CeSeekDatabaseEx();//定位要刪除的數(shù)據(jù)
            CeDeleteRecord();//刪除定位的數(shù)據(jù)
            CeWriteRecordProps();//數(shù)據(jù)寫入新數(shù)據(jù)到EDB覆蓋原數(shù)據(jù)
            CloseHandle(打開時的句柄);
            3.其他的一些數(shù)據(jù)庫操作函數(shù)

            列舉數(shù)據(jù)庫: CeFindFirstDatabaseEx和CeFindNextDatabase

            獲得數(shù)據(jù)庫的信息:CeOidGetInfoEx

            //在EDB的消息函數(shù)中用到

            釋放通告消息結(jié)構(gòu)體:CeFreeNotification
            將數(shù)據(jù)緩沖到flash上:CeFreeNotification
            獲得打開的數(shù)據(jù)庫所使用的句柄:CeGetDBInformationByHandle

            設(shè)置數(shù)據(jù)庫的各種參數(shù):CeSetDatabaseInfoEx

            列舉所有轉(zhuǎn)載的數(shù)據(jù)庫卷并返回卷名: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 閱讀(3263) 評論(0)  編輯 收藏 引用 所屬分類: PDA/PPC開發(fā)

            午夜肉伦伦影院久久精品免费看国产一区二区三区| 人妻精品久久久久中文字幕69| 久久精品国产精品亚洲精品| 精品久久久无码中文字幕| 久久精品国产免费| av国内精品久久久久影院| 99久久免费国产精品热| 久久99精品久久久久婷婷| 久久精品国产久精国产| 亚洲一区二区三区日本久久九| 99久久婷婷国产综合精品草原| 精品午夜久久福利大片| 久久精品三级视频| 国内精品伊人久久久久妇| 色欲综合久久中文字幕网| 久久人人爽爽爽人久久久| 久久99国产精品久久99| 国产69精品久久久久99| 亚洲&#228;v永久无码精品天堂久久| 久久精品免费网站网| 久久精品无码一区二区WWW| 麻豆一区二区99久久久久| 国产精品美女久久久久AV福利| 91亚洲国产成人久久精品| 久久频这里精品99香蕉久| 精品久久久噜噜噜久久久| 久久精品无码一区二区app| 伊人久久大香线蕉av不卡| 久久er国产精品免费观看2| 久久青青草视频| 亚洲国产精品人久久| 久久精品国产亚洲av麻豆图片| 99久久精品费精品国产一区二区 | 久久国内免费视频| av国内精品久久久久影院| 久久天天躁狠狠躁夜夜不卡| 久久精品人人做人人爽电影蜜月 | 99久久精品国产一区二区三区| 欧美一级久久久久久久大片| 99久久国产热无码精品免费| 女同久久|