======================================================
注:本文源代码点此下载
======================================================
sqlite是一个很好用的单机数据库,体积小巧,支持大多数sql 92语法,速度快,健壮,使用和分发都很简单。但是免费开源版并不提供加密功能,需要加密得购买原作者的一个插件,价格$2000!我们只好使用第三方的加密版本,这是被逼的。当然还有一个选择就是,在开源的c文件中已经预留了加密接口,有能力的可以自己去实现。
闲话休提。第三方的加密版本已经有人实现了,还不止一个。下面分别介绍一下:
※sqlite原装版,http://www.sqlite.org/ 目前最新版本是3.6.10。但我们现在不使用它的dll而用第三方,所以可以无视它了。需要源文件的可以去下载。
※第三方其一是用于.net环境下的system.data.sqlite.dll。它是为了.net开发的,不过也集成了原生sqlite.dll,把它改名为sqlite3.dll,直接就可以拿来用了。因为使用了windows的api来加密,所以不能跨平台,但是delphi的程序本来就不能跨平台:)。目前版本1.0.60.0,无源文件,使用的sqlite版本应该是3.5.4。
文件:system.data.sqlite.dll(用时改名为sqlite3.dll)
大小:839680 b; md5:4c42911e64bda2095434189ff8393519
链接地址: http://sqlite.phxsoftware.com/
※第二种实现是wxsqlite3。它是跨平台的wxwidgets 开源函数库的一部分,在win32平台也工作得很好。使用md5 + rc4 + 128位aes加密算法,提供cpp源文件。目前版本是1.9.4,使用的sqlite版本是3.6.10。☆推荐使用☆
文件:sqlite3.dll,大小:532480 b,
md5:70c3bbdc4b90aeb19b7381b514558558
链接地址:http://wxcode.sourceforge.net/components/wxsqlite3/
※delphi数据库控件zeoslib,是一个用来连接数据库的第三方开源控件包,据说是用来取代bde的,确实好用,但据反映在一定情况下可能有内存泄漏问题。目前版本是6.6.4,支持ado、asa、firebird、interbase、mssql、mysql、oracle、postgre sql、sqlite、sybase的各种版本,如sqlite2、sqlite3、firebird 1.5、firebird 2.0、firebird嵌入版等等。☆大力推荐☆
下面终于可以开始进入正题了,在delphi 7中如何调用sqlite的加密函数?
首先,安装zeos控件包,把我们的支持加密的sqlite3.dll文件copy到程序目录下。这里要跳出来说明一下的是,对于sqlite3加密函数的调用,在zeos 6.6.2版本之前是不支持的,需要打个补丁才行,现在已经加入到最新的版本之中了。但是网上的调用说明是有问题滴,这也是为什么要写这个文档的原因。
在程序上放一个tzconnection,名为zconnection1,设置连接数据库的参数,这些就不废话了。又跳出来一下:据说sqlite3是使用utf8编码,所以如果数据库放在中文目录下,则调用路径必须进行编码转换才行;但是用zeos连接sqlite,放在中文目录下都没问题。搞不好zeos已经自动把编码搞定了?太贴心了。
1、打开加密的数据库
var
db: pointer;
pwd: string;
i: integer;
begin
pwd := 'xxxxxx';
zconnection1.connected := true;
db := (zconnection1.dbcconnection as izsqliteconnection).getconnectionhandle;
i := (zconnection1.dbcconnection as izsqliteconnection).getplaindriver.key(db, pchar(pwd), length(pwd));
………………
2、给未加密的数据库加密或修改密码
procedure rekeydb(conn: tzconnection; pwd: string);
var
db: pointer;
i: integer;
begin
db := (conn.dbcconnection as izsqliteconnection).getconnectionhandle;
i := (conn.dbcconnection as izsqliteconnection).getplaindriver.rekey
(db, pchar(pwd), length(pwd));
if (i// 函数正常执行返回0,否则
begin
// xxxxxxx
end;;
end;
注:izsqliteconnection 的定义在zdbcsqlite单元。
以上。最后要注意的就是对sqlite3.dll的加密实现各不相同,dll文件可是不能混用的。
======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/