gpt4 book ai didi

sqlite - 在关闭应用程序之前,为什么我的SQLite数据库不添加数据?

转载 作者:行者123 更新时间:2023-12-03 03:40:33 25 4
gpt4 key购买 nike

我的Delphi应用程序正在使用FireDac和一个SQLite数据库。我注意到更新已保存在日志文件中,并且直到关闭我的应用程序,数据库文件才真正更新。

该应用程序正在对数据库进行大量的“批处理更新”。每个单独的更新都在TFDQuery.StartTransaction ... TFDQuery.Commit对中。尽管如此,似乎所有更新都保留在日志文件中,直到应用程序结束。

如何强制SQLite在每批更新之后而不是在我的应用程序完成时更新数据库?

我尝试将SQLite数据库更改为WAL,但是发生了同样的事情。

尽管使用了“ StartTransaction”和“ Commit”,但数据仍保留在日志中,直到应用程序结束。

try
Query.Connection := FDConnection1;
FDConnection1.Open;
FDConnection1.StartTransaction;
Query.SQL.Text := 'select 1 from t_Manufacturers where m_Name = ' + QuotedStr(ManString);
Query.Open;
if Query.RecordCount = 0 then begin
{ not found, so add }
Query.SQL.Text := 'insert into t_Manufacturers (m_Name, m_ManUID) values (:Name, null)';
Query.ParamByName('Name').AsString := ManString;
Query.ExecSQL;
{ save m_ManUID for logging }
Query.SQL.Text := 'select m_ManUID from t_Manufacturers where m_Name = ' + QuotedStr(ManString);
Query.Open;
end;
Result := Query.FieldByName(m_ManUID).AsInteger;
FDConnection1.Commit;
except
on E : EDatabaseError do begin
MessageDlg('Database error adding manufacturer: ' + E.Message, mtError, [mbOk], 0);
FDConnection1.Rollback;
end;


没有错误消息或问题。只要应用程序运行正常,数据库将按预期进行更新,因此我很高兴我的编程和SQL能够完全满足我的需求。

最佳答案

“似乎所有更新都保留在日志文件中,直到应用程序结束为止”,这是非常可疑的。 SQLite3对于写数据非常认真-比我所知道的大多数DB引擎都要认真。只需检查https://www.sqlite.org/atomiccommit.html

我怀疑您对日志文件的存在感到困惑。事务后,日志文件仍保留在磁盘上,准备进行任何新的写操作。但是数据实际上是写在主文件中的。

只需编写一些数据,然后在关闭应用程序之前将其杀死(使用任务管理器)。然后重新打开文件(重新启动应用程序):我几乎可以确定您会看到正确存储的数据。

为了获得最佳性能,FireDAC使用默认的日记记录模式进行“欺骗”。它使用一些可能令人困惑的默认值。如FireDAC documentation所述:将LockingMode设置为Normal以启用共享数据库访问。将“同步”设置为“普通”或“完整”可以使提交的数据对其他人可见。

关于sqlite - 在关闭应用程序之前,为什么我的SQLite数据库不添加数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57554209/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com