在 VS2008 / VS2010 下编译和使用 sqlite3

sqlite logo

原帖地址:http://blog.csdn.net/davidhsing/article/details/4204269

 

近日开发一款软件,需要用到本地数据库支持,可是在  Windows 平台,庞大而复杂的 ADO/DAO + ACCESS 相当麻烦;FoxPro/Foxbase 也是体积巨大无比,于是想找一款轻量级的本地数据库引擎,在经过无数搜索和多方比较之后,最终选定了 SQLite。

按其官方介绍:SQLite is a software library that implements a self-contained, serverless, zero-configuration, transactional SQL database engine. SQLite is the most widely deployed SQL database engine in the world. The source code for SQLite is in the public domain.

简单来说,SQLite 是个朴素(不是简单)的数据库引擎,最大可以支持 2TB 的数据存储,可以使用一个本地硬盘文件当做一个数据库来使用,像大型数据库一样增删改查。和 oracle/DB2/mysql 不同的是,它体积极为小巧,而且不需要客户端/服务器端,相当适合桌面开发;而且可以跨平台使用,在 Linux/unix 下也能很好的运行;更难能可贵的是,它还支持可以作为 PHP 的插件,构建中小型网站数据库,如 CMS 等;还可以移植到智能设备 Windows CE 上使用... 等等等等,优点太多了。

其实各位不知道留意没有,中国移动的飞信客户端,也采用了 SQLite,在其安装目录下,名为 SQLite.Interop.DLL。不过是其 C# 的版本罢了。

 

好了,言归正传,首先来看看 SQLite 在 Visual C++ 下的使用:

一般我们可以使用 LIB /DEF:SQLite.def /machine:IX86 生成 lib,在 .cpp 中 #pragma comment(lib, "SQLite.lib") 来静态链接到 SQLite 的运行库,这样当然没有问题。可是如果别人只拷贝了一个 exe 过去运行,马上“咣!”的一声:“缺少 sqlite3.dll,重新安装程序可能会解决此问题”,为了这一个 dll 而影响整个程序运行,那可不是我想要的。所以我选择了动态调用,LoadLibrary 之后 GetProcAddress,虽然相比而言麻烦了许多,可是程序健壮性提高了不少,这是值得的。

稍有点麻烦的就是 SQLite 是老外在英文环境下开发的,虽然可以支持 UTF-8 和 UTF-16 字符集,但是参数都是 char* 的 ANSI 字符集形式,所以这就麻烦了我们广大 Unicode 世界的代码民工,又是一通 WideChar 到 MultiByte 的转换。好在这个对我来说已经是轻车熟路了,也就不存在乱码的问题了,不管是使用 ANSI 编译还是使用 Unicode 编译。

至于里面具体的使用步骤,网上的例子太多,我也就不多说了,只想说一点,一些示例喜欢用 char* 作为整个查询的结果集汇总,相当于把查询结果所有数据汇总到这个 char* 字符串里面,个人觉得不太可取,还是采用了 SmartDB 的封装方式,用 CObArray 装 CStringArray* 来实现,这样后续取数就方便多了,而且面向对象的思想更强。

 

下面说说在 Windows 平台下自编译 sqlite.dll 的方法。这个话题网上很多,不过也很乱。通常我们可以直接使用其官方网站已经编译好的 dll (截至今天最新版本是 3.6.14.1),可是这个东西有 493KB,我用 Visual C++ 2008 编译之后之后 389KB,又节省了 100 多KB 的磁盘空间,呵呵

编译的时候,我觉得最简单的方式就是去其官方网站下载它汇总之后的包 sqlite-amalgamation-3_6_14_1.zip,而不要去下那个一堆 .c .h 的包,否则编译将得到很多错误和警告。

 

需要注意的是,这个源码包里面没有 .def 文件,所以对于我们自己编译 dll 的话还不好办。所以我们得还需要个文件:sqlite3.def。这个文件就在 “Precompiled Binaries For Windows” 的 sqlitedll 里面,下载它,从里面拷贝出来,添加到我们的工程。

 

点击“生成”->“批生成”,勾上“Release”,再点“生成”,咣咣的出来一大堆错误。

  1. 正在编译...  
  2. sqlite3.c  
  3. 正在链接...  
  4. sqlite3.def : error LNK2001: 无法解析的外部符号 sqlite3_column_database_name  
  5. sqlite3.def : error LNK2001: 无法解析的外部符号 sqlite3_column_database_name16  
  6. sqlite3.def : error LNK2001: 无法解析的外部符号 sqlite3_column_origin_name  
  7. sqlite3.def : error LNK2001: 无法解析的外部符号 sqlite3_column_origin_name16  
  8. sqlite3.def : error LNK2001: 无法解析的外部符号 sqlite3_column_table_name  
  9. sqlite3.def : error LNK2001: 无法解析的外部符号 sqlite3_column_table_name16  
  10. sqlite3.def : error LNK2001: 无法解析的外部符号 sqlite3_table_column_metadata   

于是赶紧查资料,于是找到了这里:

http://source.online.free.fr/Windows_HowToCompileSQLite.html

 

再去官网查了一下,原来还需要个宏

SQLITE_ENABLE_COLUMN_METADATA

When this C-preprocessor macro is defined, SQLite includes some additional APIs that provide convenient access to meta-data about tables and queries. The APIs that are enabled by this option are:

* sqlite3_column_database_name()
* sqlite3_column_database_name16()
* sqlite3_column_table_name()
* sqlite3_column_table_name16()
* sqlite3_column_origin_name()
* sqlite3_column_origin_name16()
* sqlite3_table_column_metadata()

 

于是打开 sqlite3.c,添加这个宏定义:

  1. #define SQLITE_CORE 1  
  2. #define SQLITE_AMALGAMATION 1  
  3. # 下面两个是需要添加的  
  4. #define SQLITE_ENABLE_RTREE  
  5. #define SQLITE_ENABLE_COLUMN_METADATA  


 

位置如图:

预览图

 

 

再编译就 OK 了。得到 389KB 的 dll。当然,自编译 dll 的好处是,你还可以增加一个 VersionInfo 到 dll 中。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值