现在的位置: 首页 > 综合 > 正文

嵌入式数据库sqlce和sqlite的使用方法(sqlce)

2013年03月05日 ⁄ 综合 ⁄ 共 2963字 ⁄ 字号 评论关闭

 最近由于项目需要, 要在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的就写这么多,写得不是很全,有问题可以在下面评论中交流。

抱歉!评论已关闭.