嵌入式資料庫sqlce和sqlite的使用方法(sqlce)

來源:互聯網
上載者:User

 

最近由於項目需要, 要在wince4.2, wince5.0, mobile三種機型上面做大資料量的查詢,初步估計在50W-500W條記錄之間。
由於以前做mobile5的資料庫專案主要是採用C#來寫,而且資料量也頂多幾萬條,所以,為了確保項目後期少走彎路,我特意做了一下移動資料庫效能測試。下面是這周的工作記錄。供大家參考。
一. 由於wince4.2在打包OS的時候沒有帶.net的支援,所以,只能選用C++,也是為了各平台移植方便。
 初步考慮採用sqlce 和 sqlite中的一種,sqlce是ms的東東,比較穩定。sqlite的開源的,使用方便,查詢速度快。因此,兩種我都做了一下測試。
 1. sqlce開發環境:
  EVC4 + sp4。 VS2005。 SqlCe 3.0
  1). 先用VS2005寫了一個小程式,產生50萬條類比資料。(在vs2005下操作sdf檔案需要安裝一個sqlce的包)
  2). 在wince上使用sqlce的話,需要把以下檔案copy到windows目錄(我的wince沒有內建sqlce包):
      sqlcese30.dll,sqlceqp30.dll,sqlceoledb30.dll,sqlceme30.dll,sqlceer30CN.dll,並註冊sqlceoledb30.dll方能正常操作資料庫。(或者直接安裝sql的cab包也行)
  3). 開始編wince下的程式,操作sqlce資料庫.
     ::CoInitializeEx(NULL,COINIT_MULTITHREADED);
     //註冊sqlce dll
     LRESULT   (CALLBACK*   lpDllEntryPoint)();   //聲明在CPP檔案的前段
     //註冊
   HINSTANCE   hLib   =   LoadLibrary(L"//Windows//sqlceoledb30.dll");
   if   (hLib  == NULL )
    return  ;
   (FARPROC&)lpDllEntryPoint   =   GetProcAddress(hLib,     _T("DllRegisterServer"));
       (*lpDllEntryPoint)();

  //OLEDB方式操作sqlce,都是一些COM相關的東東
 HRESULT   hr;
 // TODO: Add your control notification handler code here
 IDBInitialize   *pIDBInitialize;
 IDBCreateSession   *pIDBCreateSession;
 IDBCreateCommand   *pIDBCreateCommand;
 ICommandText   *pICommandText;
 IDBProperties   *pIDBProperties;
 IUnknown   *pIUnknown;
 DBPROP   dbprop[1];
 DBPROPSET   dbpropset[1];

 

 hr   =   CoCreateInstance(CLSID_SQLSERVERCE_3_0,   0,   CLSCTX_INPROC_SERVER,
 IID_IDBInitialize,   (void**)&pIDBInitialize);

 if   (FAILED(hr))
 {
  return   ;
 }

 dbprop[0].dwPropertyID   =   DBPROP_INIT_DATASOURCE;
 dbprop[0].dwOptions   =   DBPROPOPTIONS_REQUIRED;
 dbprop[0].vValue.vt   =   VT_BSTR;
 dbprop[0].vValue.bstrVal   =   SysAllocString(L"//db.sdf"); //Need   oleaut32.lib

 if   (dbprop[0].vValue.bstrVal   ==   NULL)
 {
  return   ;
 }

 dbpropset[0].guidPropertySet   =   DBPROPSET_DBINIT; //#define   DBINITCONSTANTS
 dbpropset[0].cProperties   =   sizeof(dbprop)   /   sizeof(dbprop[0]);
 dbpropset[0].rgProperties   =   dbprop;

 hr   =   pIDBInitialize-> QueryInterface(IID_IDBProperties,(void**)&pIDBProperties);

 if   (FAILED(hr))
 {
  return   ;
 }

 hr   =   pIDBProperties-> SetProperties(sizeof(dbpropset)/sizeof(dbpropset[0]),dbpropset);

 if   (FAILED(hr))
 {
  return   ;
 }

 hr   =   pIDBInitialize-> Initialize();

 if   (FAILED(hr))
 {
  return   ;
 }

 hr   =   pIDBProperties-> QueryInterface(IID_IDBCreateSession,(void**)&pIDBCreateSession);

 if   (FAILED(hr))
 {
  return   ;
 }
 hr   =   pIDBCreateSession-> CreateSession(NULL,IID_IUnknown,&pIUnknown); //Need   uuid.lib
 if   (FAILED(hr))
 {
  return   ;
 }
 hr   =   pIUnknown-> QueryInterface(IID_IDBCreateCommand,(void**)&pIDBCreateCommand);
 if   (FAILED(hr))
 {
  return   ;
 }
 hr   =   pIDBCreateCommand-> CreateCommand(NULL,IID_ICommandText,(IUnknown   **)&pICommandText);
 if   (FAILED(hr))
 {
  return   ;
 }
 hr   =   pICommandText-> SetCommandText(DBGUID_SQL,L"select * from sninfo");  //執行查詢
 if   (FAILED(hr))
 {
  return   ;
 }
 hr   =   pICommandText-> Execute(NULL,IID_NULL,NULL,NULL,NULL);
 if   (FAILED(hr))
 {
  return   ;
 } 

  記得網上有採用ADO的方式操作sqlce,但聽聞ms不再更新,而採用oledb方式,只是比較麻煩一點了,這樣也有助於我們瞭解一下sqlce的一些介面。 
  sqlce的就寫這麼多,寫得不是很全,有問題可以在下面評論中交流。

原文地址:http://blog.csdn.net/xiangding/article/details/2982267

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.