密码:未能保留信封空间

时间:2014-12-12 19:55:54

标签: sqlite delphi encryption firedac

我试图在运行于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的错误信息试图告诉我什么?

1 个答案:

答案 0 :(得分:1)

TFDSQLiteSecurityOptions FireDAC.Phys.SQLite.TFDSQLiteSecurity.Options

您是否设置了选项soSetLargeCache

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

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

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

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