• <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

            靜以修身,儉以養德,非澹薄無以明志,非寧靜無以致遠。
            隨筆 - 397, 文章 - 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 閱讀(3263) 評論(0)  編輯 收藏 引用 所屬分類: PDA/PPC開發

            国产精品内射久久久久欢欢| 久久国产精品无码HDAV| 99久久成人国产精品免费| 国产午夜精品久久久久免费视| 东京热TOKYO综合久久精品| 欧美激情精品久久久久| 久久香蕉国产线看观看猫咪?v| 久久精品综合网| 久久亚洲精品国产精品| 久久精品成人影院| 囯产极品美女高潮无套久久久| 久久狠狠高潮亚洲精品| 久久久噜噜噜久久中文字幕色伊伊| 天天影视色香欲综合久久| 国产精品久久久久无码av| 婷婷国产天堂久久综合五月| 99久久无色码中文字幕| 97精品依人久久久大香线蕉97| 91久久成人免费| 九九精品99久久久香蕉| 久久这里有精品| 久久久久亚洲精品无码网址| 久久婷婷综合中文字幕| 国内精品久久久久久99蜜桃| 模特私拍国产精品久久| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区| av色综合久久天堂av色综合在| 久久久久久青草大香综合精品| 72种姿势欧美久久久久大黄蕉| 狠狠色丁香久久婷婷综合| 亚洲日韩欧美一区久久久久我| 777久久精品一区二区三区无码| 久久久久亚洲Av无码专| 色欲久久久天天天综合网| 久久久久一本毛久久久| 精品久久综合1区2区3区激情| 国产一区二区三区久久| 久久91精品国产91久久小草| 国产一久久香蕉国产线看观看| 久久午夜伦鲁片免费无码| 人妻少妇久久中文字幕一区二区|