桌面轻量级数据库的选择:Access、SQLite、自己编写?
1. Access
我们做小项目的时候特别是小的MIS系统一般也都要用数据库来保存数据。经观察大部分的小系统都是用Access数据库,有的系统为了掩盖数据库的类型,把数据文件后缀名改了,其实只要改回到mdb,用Access打开,数据一目了然,其实Access数据库本身有很多的问题:性能不行;数据不安全,用户可以直接用Access打开数据库文件进行数据修改,即使加密后都可以直接破解;Access的数据量一大,文件本身的体积就异常庞大;Access数据库文件很容易损坏,我做的一个系统由于意外断电老是当掉,用户的数据几经摧毁。 为了弥补Access的缺陷,我曾经用MySQL数据库代替,但MySQL是网络数据库,安装起来比较复杂。后来在用Python做项目的时候发现了SQLite,真是相见恨晚,SQLite就是Access理想的替代品啊!
SQLite是一个小型的C程序库,实现了独立的,可嵌入的,零配置的SQL数据库引擎。特性包括:
-
事务操作是原子,一致,孤立,并且持久的(ACID),即使在系统崩溃和电源故障之后。
-
零配置——不需要安装和管理。
-
实现了绝大多数SQL92标准。
-
整个数据库存储在一个单一的文件中。
-
数据库文件可以在不同字节序的机器之间自由地共享。
-
支持最大可达2T的数据库。 (241 字节)
-
字符串和BLOB类型的大小最大可达 2G 字节(231字节)。
-
小的代码: 完整配置的少于250KB,忽略一些可选特性的少于150KB。
-
在大多数常见操作上比流行的客户/服务器数据库引擎更快。
-
简单,易于使用的API。
-
内建TCL绑定。 另外提供可用于许多其他语言的绑定。
-
具有良好注释的源代码,95%经过测试。
-
独立:没有外部依赖。
-
源代码位于公共域。 可用于任何用途。
SQLite用的非常广泛,Web应用也都在用它,PHP5都内置了SQLite的扩展,所以SQLite是桌面轻量级数据库的首选。除了Access和SQLite外,还有Firebird等数据库,我觉得SQLite足够小系统使用了。但是SQLite是通用的数据库系统,生成的数据库文件很容易用二进制编辑器打开,打开后文件首部赫然就是“SQLite format 3”,这就暴露了我们的数据文件是SQLite文件,数据库系统是SQLite,只要用SQLite工具打开这个文件就可以看到数据库中的内容了。那为了私密性我们能做哪些工作呢?
我们有时为了私密性,不想让软件用户知道我们使用的数据库系统可以采取不同的加密措施。Access数据库可以设置密码达到保护数据的目的,但是Access的密码保存在Access的数据库文件中,用工具可以很容易的取得数据库的密码,这样我们的数据结构就很容易暴露给别人了。最安全的方法是我们自己编写数据库管理系统,这样我们的数据存储格式是私有的别人根本无法知道,这样即使他能看到文件中的二进制数据也没有办法直接看到数据模型的结构。但是,自己做一个数据库管理系统虽然不是太难,无非是存储管理,索引管理,SQL接口等,但如果没有相应的开发经验还是比较费时费力的,那我们能不能用“拿来主义”,用现成的数据库管理系统改造成我们自己的数据库管理系统呢?当然可以。就拿SQLite来说,它是全部开源的,可以从其网站上下载到最新的源代码,然后把源代码修改成我们自己的格式后进行编译就可以了。这对于Linux下的用户来说相当容易,但对于Windows下的不太用VC、BC的开发者来说,配置编译环境,配置导出DLL等操作还是比较费事的,我们就用现成的编译好的文件来修改吧。
用现成编译好的文件进行修改需要二进制的编辑器,推荐使用Ultraedit。为了更好的演示,我们假设用我比较熟悉的Delphi进行开发,用Delphi来访问SQLite可以采用两种方式:一种是用ODBC,SQLite提供ODBC的驱动;另外一种采用ASQLite组件进行访问,ASQLite是专门的封装SQLite DLL的组件包,可以在http://www.sqlite.com.cn/Upfiles/source/ASQLite.rar下载。我们选用ASQLite,对于ODBC的方法与ASQLite的类似,我们分步骤完成。
-
下载SQLite,可以在http://www.sqlitecn.org/download.html下载,我们下载Windows版本的,里面自带一个命令行工具用于建库等数据库操作。
-
下载ASQLite,并安装到Delphi中。
-
打开ASQLite的例子程序可以看到SQLite的演示,我们下面的修改以此例子程序为例。
-
ASQLite是sqlite3.dll的封装,我们要修改的是数据库文件、sqlite3.dll和ASQLite三个地方。
-
修改数据库文件。
数据库文件名为SampleDB,用UltraEdit打开此文件,在最上面可以看到“SQLite format 3”的字样,这是SQLite数据文件的标识,我们只需要修改这部分就可以了,比如修改为“CrazyCom DBEN 6”,最好和原长度一样,不一样的后面一定要改为“00”(十六进制)。
-
修改sqlite3.dll。
修改完上面的数据库文件后,如果这时运行例子程序会出现数据格式不对的提示,所以对sqlite3.dll进行相应的修改。
1)修改文件标识代码
打开sqlite3.dll,查找“SQLite format 3”,找到后改为“CrazyCom DBEN 6”,这样运行例子程序应该正常了。
2)修改函数导出表
我们用DLL、Exe的查看工具如Depend可以看到DLL导出了哪些函数,sqlite3.dll导出的函数都以“sqlite3_”打头的,这就暴露了我们使用的数据库是SQLite了,所以需要修改为不太容易辨识的名字如“crazydb_”打头。要修改首先要找到导出表的位置,在UltraEdit中查找“sqlite3_”,当看到很多字符串都是以“sqlite3_”开始的时候就找到了,具体应该在0x39db8偏移量处。这时如果运行例子程序,例子程序会报异常,因为它找不到相应的函数入口了,所以我们必须修改ASQLite的源文件。
-
修改ASQLite。
ASQLite是对sqlite3.dll的组件化封装,所有的调用还是通过sqlite3.dll实现的,既然我们修改了sqlite3.dll的导出函数接口,我们必须修改ASQLite中和sqlite3.dll的接口部分。接口文件就是ASGSQLite3.pas,打开此文件,找到TASQLite3DB.LoadLibs函数,看到了吧,这个函数加载sqlite3.dll,并找到各个函数。我们只需要修改各个函数的名称就可以了。当然要和sqlite3.dll的导出函数名称对应。
修改完后重新安装ASQLite。
重新编译例子程序,运行正常。到此已经基本完成了修改工作。
-
修改DLL名称。
由于SQLite的DLL名称是sqlite3.dll,很容易让人猜到是SQLite,我们可以把DLL的名字改掉,具体改什么名字可以随意,比如我们改为crazycomdb.dll。改完后要在例子程序中进行对应的修改,即设置TASQLite3DB的DriverDLL = 'crazycomdb.dll'。