最近由於項目需要, 要在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