最近由于项目需要, 要在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慢。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/allenray0202/archive/2009/01/05/3711751.aspx


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lyx_wq/archive/2009/06/05/4245805.aspx


类别:Wince | 添加到搜藏 | 浏览(225) | 评论 (0)
 
 
最近读者:
登录后,您就出现在这里。
posted @ 2009-11-16 10:03 Jade 阅读(2331) 评论(0) 编辑

流驱动的编写有固定的接口函数,其中涉及到中断的地方是很容易让人不解的,在这里记录下关于Wince5.0驱动中中断编写的一般方法,以供以后参看。

Wince5.0中断主要有以下几步:

1、在 \Platform\ \INC 定义要用到的中断的逻辑中断号;

2、在smdk2410\kernel\hal\arm\armint.c 中找到OEMInterruptHandler函数 参照其他中断写法,判断中断源号,返回逻辑中断号

3、在smdk2410\kernel\hal\cfw.c中 仿照其他中断,对以下三个函数 OEMInterruptEnable()、OEMInterruptDisable()、OEMInterruptDone()这三个函数分别进行处理;

4、在驱动程序里调用InterruptInitialize(),来实现中断与事件的联系;

5、InterruptDone开中断 ,开启等待线程,循环等待;

详细的可以看串口的驱动方法

posted @ 2009-11-16 09:59 Jade 阅读(99) 评论(0) 编辑

关于将鼠标隐藏的问题,我在网上搜了一下相关的资料。大多数都是用ShowCursor(BOOL bShow)这个函数去实现。但是在我测试的时候却发现:在窗体创建之前和该窗体的每条消息处理操作之前都ShowCursor(FALSE);开始弹出窗体的时候确实看不到鼠标,点击操作也没有发现鼠标的影子,但是在刷屏的时候可恶的鼠标又出现了(例如将窗体最小化再最大化)。
        据说FrameWork下面的Cursor.Hide()可以实现隐藏鼠标,由于没有环境也没有测试过。不过在EVC中我无意中发现了一个办法可以真正实现鼠标的隐藏:就是用系统函数SetCursor(NULL);
       我是在窗体创建之前用上述函数设置了一把,编译好测试。最大化最小化,鼠标果然没有出现。

 

测试过:不行,有时候还是会出现

 

http://topic.csdn.net/u/20070907/16/6b68ee8f-4f29-453c-94e2-60b86e6d8d7f.html

隐藏鼠标其实挺简单的,两种方法:
1.真隐藏:ShowCursor(FALSE);//隐藏鼠标
2.假隐藏,就是在程序启动时,将鼠标定位在屏幕右下角,在程序应用过程中可以随时调用鼠标(呵呵治标不治本)
::SetCursorPos(m_FullScreenRect.right, m_FullScreenRect.bottom);

 

楼主是要隐藏鼠标吗,
以下方法是在编译内核时设置的:
Core OS -> CEBASE -> Shell and User Interface -> User Interface 把mouse选项去掉编译,就可以把鼠标干掉

 

把显示驱动s3c2410disp.cpp文件的movepoint函数中把以下代码屏蔽掉也行。

if (xPosition != -1 || yPosition != -1)
{
m_CursorRect.left = xPosition - m_CursorHotspot.x;
m_CursorRect.right = m_CursorRect.left + m_CursorSize.x;
m_CursorRect.top = yPosition - m_CursorHotspot.y;
m_CursorRect.bottom = m_CursorRect.top + m_CursorSize.y;
CursorOn();
}

 

我在800x480的屏上使用下面三句话好像就可以了,目前测试没太大问题

ShowCursor(FALSE);
SetCursor(NULL);
::SetCursorPos(820, 500);

posted @ 2009-11-16 09:56 Jade 阅读(469) 评论(0) 编辑