我试图在运行于Windows 7(64位)的Delphi XE7应用程序中通过FireDAC加密/解密SQLite数据库。
代码如下所示:
Procedure TMain.ActionBtnClick(Sender: TObject);
Begin
If ActionBtn.Caption = 'Encrypt' Then
Begin
SetPassword;
FDSQLiteSecurity.SetPassword;
End
Else
FDSQLiteSecurity.RemovePassword;
SetStatus;
End;
Procedure TMain.DBNamePropertiesButtonClick(Sender: TObject; AButtonIndex: Integer);
Begin
If OpenDialog.Execute Then
Begin
DBName.Text := OpenDialog.FileName;
SetStatus;
End;
End;
Procedure TMain.FormClose(Sender: TObject; Var Action: TCloseAction);
Var
Reg: TRegistry;
Begin
Reg := TRegistry.Create;
Try
Reg.OpenKey('\SQLiteSecurity', True);
Reg.WriteString('Database', DBName.Text);
Finally
Reg.CloseKey;
Reg.Free;
End;
End;
Procedure TMain.FormShow(Sender: TObject);
Var
Reg: TRegistry;
Begin
DBStatus.Caption := '';
Reg := TRegistry.Create;
Try
Reg.OpenKey('\SQLiteSecurity', True);
If Reg.ValueExists('Database') Then
Begin
DBName.Text := Reg.ReadString('Database');
SetStatus;
End;
Finally
Reg.CloseKey;
Reg.Free;
End;
End;
Procedure TMain.SetPassword;
Var
s: String;
Begin
FDSQLiteSecurity.Database := DBName.Text;
BEK(s);
FDSQLiteSecurity.Password := s;
End;
Procedure TMain.SetStatus;
Begin
DBStatus.Caption := FDSQLiteSecurity.CheckEncryption;
If DBStatus.Caption = '<unencrypted>' Then
ActionBtn.Caption := 'Encrypt'
Else
ActionBtn.Caption := 'Decrypt';
End;
尝试加密时,在读取&#34; FDSQLiteSecurity.SetPassword;&#34;的行中,收到以下错误消息:
[FireDAC] [Phys] [SQLite]错误:密码:未能保留信封空间。
我试图找到此错误消息的含义但没有成功。有谁知道SQLite的错误信息试图告诉我什么?
答案 0 :(得分:1)
TFDSQLiteSecurityOptions FireDAC.Phys.SQLite.TFDSQLiteSecurity.Options
您是否设置了选项soSetLargeCache
?
使用选项属性指定数据库加密选项。
由于当前的SQLite加密限制,SetPassword / ChangePassword / RemovePassword调用将失败,如果数据库的blob字段的值大小超过1个DB页面,并且数据库不适合SQLite缓存。
如果设置了soSetLargeCache
,则SetPassword / ChangePassword / RemovePassword会自动将缓存大小设置为大于数据库大小,以使数据库完全适合内存。
如果DB大小大于可访问的系统内存,则相应的调用将失败。