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

 

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

(2009-12-10 11:38:59)
    一. 由于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_r(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的一些接口。

二. 在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"//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分多钟),一定记得要建索引哦。否则查询非常慢。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
三个数据库的性能对比:Access是一种桌面级数据库,适合小型应用程序,性能较低;SQLCE是一种轻型数据库,适合移动设备和桌面级应用程序,性能较高;SQLite是一种嵌入式数据库,适合嵌入式设备和桌面级应用程序,性能也很高。 关于ORM的支持,Access和SQLCE都有官方的ORM框架,分别是Entity Framework和LINQ to SQL;而SQLite没有官方的ORM框架,但可以使用第三方框架,比如Sqlite-net。 下面是三个数据库使用ORM进行编程的示例: 1. Access使用Entity Framework进行编程: - 首先,需要在Visual Studio中安装Entity Framework; - 在项目中添加ADO.NET Entity Data Model; - 选择“EF Designer from database”选项,连接到Access数据库; - 选择要生成实体类的表,生成实体类; - 使用LINQ进行查询和操作数据。 2. SQLCE使用LINQ to SQL进行编程: - 首先,需要在Visual Studio中安装SQL Server Compact; - 在项目中添加LINQ to SQL Classes; - 连接到SQLCE数据库,生成实体类; - 使用LINQ进行查询和操作数据。 3. SQLite使用Sqlite-net进行编程: - 在NuGet中安装Sqlite-net; - 定义实体类,使用特性进行映射; - 使用SqliteConnection对象进行连接; - 使用SqliteCommand对象进行查询和操作数据。 关于VC++工程的配置和代码示例,这里只能给出大致的步骤: 1. Access的VC++工程配置: - 在项目中添加Microsoft DAO 3.6 Object Library引用; - 使用DAO API进行操作数据。 2. SQLCE的VC++工程配置: - 在项目中添加Microsoft SQL Server Compact 3.5 SP2引用; - 使用SQLCE API进行操作数据。 3. SQLite的VC++工程配置: - 在项目中添加sqlite3.h和sqlite3.lib文件; - 使用SQLite API进行操作数据。 代码示例可以参考相关文档和教程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值