3

我正在尝试在 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;

尝试加密时,在显示为“FDSQLiteSecurity.SetPassword;”的行中,我收到以下错误消息:

[FireDAC][Phys][SQLite] 错误:密码:未能保留信封空间。

我试图找到此错误消息的含义但没有成功。有谁知道 SQLite 的错误消息试图告诉我什么?

4

1 回答 1

1

TFDSQLiteSecurityOptions FireDAC.Phys.SQLite.TFDSQLiteSecurity.Options

你设置选项了soSetLargeCache吗?

使用Options属性指定数据库加密选项。

由于当前 SQLite 加密限制,如果数据库具有值大小大于 1 个 DB 页的 blob 字段,并且数据库不适合 SQLite 缓存,则SetPassword / ChangePassword / RemovePassword 调用将失败。

如果soSetLargeCache已设置,则 SetPassword / ChangePassword / RemovePassword 会自动将缓存大小设置为大于 DB 大小,以使数据库完全装入内存。

如果 DB 大小大于可访问的系统内存,则相应的调用将失败。

于 2014-12-12T22:54:06.547 回答