概述
由于以前做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的就写这么多,写得不是很全,有问题可以在下面评论中交流。
二. 在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)
CppSQLite3DB db; //新建表 db.close(); 三. 后记 |
最后
以上就是潇洒戒指为你收集整理的sqlce与sqlite数据库的比较的全部内容,希望文章能够帮你解决sqlce与sqlite数据库的比较所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复