wince上数据库:sqlce和sqlite

最近由于项目需要, 要在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"http://www.cnblogs.com/Jade2009/admin/file://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"http://www.cnblogs.com/Jade2009/admin/file://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的一些接口。 二. 在wince上使用sqlite数据库: 1. 环境:EVC4 + sp4 1). 在 http://sqlite-wince.sourceforge.net/ 中下载 SQLite for Windows CE 的DLL 源代码. 2). eVC里新建一个“WCE Dynamic-Link Library”工程,命名为:sqlite 3). 在接下来的对话框中选择"An empty Windows CE DLL project",点击 FINISH,之后再点击 OK 4). 将源码中所有的 *.c *.h *.def 复制到工程文件夹下 5). 添加所有除shell.c和tclsqlite.c文件外所有文件到项目中。 6). 编译生成sqlite.lib和sqlite.dll. 2. 在 http://softvoile.com/development/CppSQLite3U/下载 高人用C++封装的sqlite的类,(基于上面生成的sqlite.lib) 一般来讲,我们都会是先在windows上使用sqlite的数据库,并导入基础数据。然后把数据库copy到wince里,再操作。 此类是封装的sqlite的unicode函数,能在windows下和wince下都正常使用,但有一点要注意: 如果要在windows下使用,因为VC6默认是建的_MBCS项目,而如果要调用unicode的函数,生成utf16数据以供在wince下能正常显示中文,则需要把项目的编译参数从_MBCS 改为:UNICODE _UNICODE。 3. 这下我们就可以在evc4里面操作sqlite数据库了: //打开数据库 CppSQLite3DB db; //打开或新建一个数据库 db.open(L"http://www.cnblogs.com/Jade2009/admin/file://ding.db/"); //新建表 db.execDML(L"create table sninfo(id nchar(12), area nvarchar(6), info nvarchar(60),source nchar(6), target nchar(6))"); //查询 CppSQLite3Query q = db.execQuery(L"select * from sninfo where area='广州区'"); CString strTemp; while (!q.eof()) { strTemp.Format(_T("%s-%s-%s-%s"),q.fieldValue(0),q.fieldValue(3),q.fieldValue(4),q.fieldValue(1)); m_list.AddString(strTemp); //显示到listbox控件中 q.nextRow(); } q.finalize(); db.close(); 4.对sqlite的数据库操作就介绍到这里,我目前也就用了这么多,更多的我也需要学习,在 wince或mobile下用sqlite要注意一点的是,数据库的路径中不要含有中文字,否则会打开失败,如果非要用中文,那必须得转成utf-8才行,sqlite内部是通过utf-8来读取的。 三. 后记 对比了一下sqlce和sqlite在查询50W记录时的性能,都可以在2秒钟之内完成,(一开始我没建index,查了4分多钟,晕),一定记得要建索引哦。否则查询N慢。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值