在lazarus中使用加密sqlite3数据库
sqlite3是跨平台开源数据库,运行快捷,使用简单,只一个dll、so即可驱动。
国产信创操作系统中默认安装了驱动。但没有加密功能。
从网上下载sqlite3的加密C脚本,自行编译for win\linux arm驱动。
注意:
1、linux和win对文件夹的要求有异同;
2、sqlite默认不打开外键,必须手动打开。
unit MainDMunit;
{$mode ObjFPC}{$H+}
interface
uses
Classes, SysUtils, Controls, ZConnection, ZDataset,Forms;
type
{ TMainDM }
TMainDM = class(TDataModule)
ImageList1: TImageList;
ImageList2: TImageList;
ImageList3: TImageList;
ZConnect: TZConnection;
ZQTyUserdw: TZQuery;
ZQUserdw: TZQuery;
ZQBalance: TZQuery;
procedure DataModuleCreate(Sender: TObject);
private
public
end;
var
MainDM: TMainDM;
implementation
{$R *.lfm}
{ TMainDM }
uses ZDbcSqLite;
procedure RekeyDB(conn: TZConnection; pwd: string);
var
db: Pointer;
i: integer;
begin
if not conn.Connected Then conn.Connect;
db := (conn.DbcConnection as IZSQLiteConnection).GetConnectionHandle;
i := (conn.DbcConnection as IZSQLiteConnection).GetPlainDriver.ReKey
(db, PChar(pwd), Length(pwd));
If (i <> 0) then // 函数正常执行返回0,否则
begin
;
end;
end;
function IsSQLite3File(const FileName: TFileName): boolean;
var F: THandle;
Header:array [0..15] of char ;
begin
F := FileOpen(FileName,fmOpenRead or fmShareDenyNone);
if F= THandle(-1) then
result := false else begin
FileRead(F,Header,15);
if Header='SQLite format 3' then
result:=true
else
result := false;
FileClose(F);
end;
end;
procedure TMainDM.DataModuleCreate(Sender: TObject);
begin
ZConnect.Disconnect;
ZConnect.Protocol:='sqlite-3';
ZConnect.ClientCodepage:='UTF-8';
//linux打开数据库和库用绝对路径,否则创建桌面快捷方式将不能连接数据库
//win用相对路径,否则无法在中文文件夹中打开数据库
{$ifdef linux}
ZConnect.LibraryLocation:= ExtractFilePath(Application.ExeName)+'libsqlite3.so' ;
{$endif}
{$ifdef windows}
ZConnect.LibraryLocation:='sqlite3mc.dll'; //在win下运行时必须改为相当路径
{$endif}
ZConnect.Properties.Clear;
ZConnect.Properties.Add('encrypted=yes');
//ZConnect.Properties.Add('ClientCodepage=UTF-8');
ZConnect.Properties.Add('controls_cp=CP_UTF8');
ZConnect.Properties.Add('AutoEncodeStrings=True');
{$ifdef windows}
ZConnect.Database:='test.db'; //在win下运行时必须改为相当路径
{$else}
ZConnect.Database:= ExtractFilePath(Application.ExeName)+'test.db';
{$endif}
if IsSQLite3File('test.db') then
RekeyDB(ZConnect,'123123') //未加密,则设置数据库密码
else
begin
ZConnect.Password:='123123';//已加密
ZConnect.connect;
end;
ZConnect.ExecuteDirect('PRAGMA foreign_keys=ON'); //必须明确调用才能打开外键
end;
end;
end.
浙公网安备 33010602011771号