【问题标题】:FireDAC SQLite backup saves no dataFireDAC SQLite 备份不保存数据
【发布时间】:2013-05-23 23:32:08
【问题描述】:

执行以下代码时,数据库文件只有表名。似乎没有字段名称或实际数据被复制。

procedure TdbModule.BackupDB();
begin
  ADConnection1.Connected := True;
  ADSQLiteBackup1.DatabaseObj := ADConnection1.CliObj;
  ADSQLiteBackup1.DestDatabase := 'd:\dan.sdb';
  ADSQLiteBackup1.Backup;
end;

dan.sdb 文件正在创建中,它只是缺少任何备份数据。该应用程序显示数据并且工作正常。

想法?

【问题讨论】:

  • 不相关,只是一个旁注,在 Delphi 中,您不必像其他语言一样在方法末尾包含括号 ()。如果你没有参数,那么你可以删除它们。
  • 仅关闭与 db 的连接,调用 CopyFile(...) 进行备份,重新打开与 db 的连接还不够吗?
  • @ComputerSaysNo 可以,但是SQLite3 backup API was designed to be better:“此过程在许多情况下运行良好,并且通常非常快。但是,此技术具有以下缺点:任何希望写入的数据库客户端创建备份时的数据库文件必须等到共享锁被放弃。它不能用于将数据复制到内存数据库或从内存数据库复制数据。如果在复制数据库文件时发生电源故障或操作系统故障,备份数据库可能系统恢复后损坏”

标签: delphi delphi-xe4 firedac


【解决方案1】:

您是否有一个 SQLite 内存数据库,其中有几个使用 FireDAC LocalSQL 连接到它的 TADMemTable / 其他数据集?

如果是,则备份不会复制数据集的内容,因为它们表示为 SQLite 虚拟表。备份只复制常规表的内容。

作为解决方法,您应该:

  • 对每个 ADMemTable 执行 CREATE TABLE ... AS SELECT ... 命令以将它们复制到常规表中;
  • 将 ADLocalSQL.Active 设置为 False;
  • 执行备份。

【讨论】:

  • 这就是我现在拥有的,是的。我最近更改了我的设计,以便数据库连接引用 :memory: 并且我将表直接创建到内存数据库。然后使用 TADTable 我可以创建备份。完美运行。谢谢。
猜你喜欢
  • 2016-06-20
  • 2015-04-21
  • 2011-06-20
  • 2019-05-10
  • 2014-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多