您的位置:首页 > 数据库

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

2011-09-14 09:41 459 查看
最近由于项目需要, 要在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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: