Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sqlite 密码:未能保留信封空间_Sqlite_Delphi_Encryption_Firedac - Fatal编程技术网

Sqlite 密码:未能保留信封空间

Sqlite 密码:未能保留信封空间,sqlite,delphi,encryption,firedac,Sqlite,Delphi,Encryption,Firedac,我正在尝试通过FireDAC对运行在Windows7(64位)上的DelphiXe7应用程序中的SQLite数据库进行加密/解密 代码如下所示: Procedure TMain.ActionBtnClick(Sender: TObject); Begin If ActionBtn.Caption = 'Encrypt' Then Begin SetPassword; FDSQLiteSecurity.SetPassword; End Else FDSQLiteSec

我正在尝试通过FireDAC对运行在Windows7(64位)上的DelphiXe7应用程序中的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;
程序TMain.ActionBtnClick(发送方:TObject);
开始
如果ActionBtn.Caption='Encrypt',则
开始
设置密码;
FDSQLiteSecurity.SetPassword;
终点
其他的
FDSQLiteSecurity.RemovePassword;
固定状态;
结束;
过程TMain.DBNamePropertiesButtonClick(发送方:toObject;AButtonIndex:Integer);
开始
如果是OpenDialog,则执行
开始
DBName.Text:=OpenDialog.FileName;
固定状态;
结束;
结束;
过程TMain.FormClose(发送方:TObject;Var操作:TCloseAction);
变量
注册:树木学;
开始
Reg:=TRegistry.Create;
尝试
注册表OpenKey('\SQLiteSecurity',True);
Reg.WriteString('Database',DBName.Text);
最后
注册关闭键;
注册免费;
结束;
结束;
程序TMain.FormShow(发送方:ToObject);
变量
注册:树木学;
开始
说明:='';
Reg:=TRegistry.Create;
尝试
注册表OpenKey('\SQLiteSecurity',True);
如果存在注册值(“数据库”),则
开始
DBName.Text:=Reg.ReadString('Database');
固定状态;
结束;
最后
注册关闭键;
注册免费;
结束;
结束;
程序TMain.SetPassword;
变量
s:字符串;
开始
FDSQLiteSecurity.Database:=DBName.Text;
贝克(s);
FDSQLiteSecurity.Password:=s;
结束;
程序TMain.SetStatus;
开始
DBStatus.Caption:=FDSQLiteSecurity.CheckEncryption;
如果DBStatus.Caption='',则
ActionBtn.Caption:=“加密”
其他的
ActionBtn.Caption:=“解密”;
结束;
尝试加密时,在“FDSQLiteSecurity.SetPassword;”行中,我收到以下错误消息:

[FireDAC][Phys][SQLite]错误:密码:无法保留信封空间


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

TFDSQLiteSecurityOptions

您是否设置了选项
soSetLargeCache

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

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

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


如果数据库大小大于可访问的系统内存,则相应的调用失败

默认情况下,TFDSQLiteSecurithy组件将soLargeCache设置为true。这意味着这不可能是错误的来源。只是想问一下最终结果如何?很久以前我就不记得细节了,但我认为FireDAC的下一个版本解决了这个问题。我再也看不到这个错误了。很高兴知道它已经解决了,我们正计划将一个基于SQLite包装的cod迁移到使用FireDAC。谢谢你的更新