gpt4 book ai didi

sqlite - SQLite数据库的Delphi Xe5 firedac数据库锁定错误

转载 作者:行者123 更新时间:2023-12-03 18:36:04 24 4
gpt4 key购买 nike

我试图创建一个简单的对象来处理我所有与数据库相关的功能。我有一个返回数据集或执行命令的函数。现在,当我从程序中调用它时,我可以使用Execute_Dataset来获取记录,并且可以正常工作,但是当我进行更改并通过调用Execute_Command执行命令时,在调用提交事务时出现错误“数据库已锁定”。我已经尽我所能,一切仍然会发生。有人可以告诉我我在做错什么以及如何防止这种情况发生。

  function TConnectionManager.Execute_Dataset(const ASql: string; const AParams:
array of variant; out VDataset: TDataset; const ATrn_Name: string): Boolean;
var
lTrn: TFDTransaction;
lQry: TFDQuery;
begin
Result := True;
lTrn:= TFDTransaction.Create (Self);
try
lTrn.Connection := FConnection;
lTrn.StartTransaction;
lQry := TFDQuery.Create (Self);
lQry.Connection := FConnection;
lQry.Transaction := lTrn;
try
if Length (AParams) > 0
then lQry.Open (ASql, AParams)
else lQry.Open (ASql);
VDataset := lQry;
Result := True;
{ Commit transaction if started within the procedure }
lTrn.Commit;
except
on e:Exception
do begin
{ Rollback transaction if started within the procedure }
lTrn.Rollback;
lQry.DisposeOf;
//log
raise;
end;
end;
finally
lTrn.DisposeOf;
end;
end;



procedure TConnectionManager.Execute_Command(const ASql: string; const AParams:
array of variant; const ATrn_Name: string);
var
lTrn: TFDTransaction;
lQry: TFDQuery;
begin
lTrn:= TFDTransaction.Create (Self);
try
lTrn.Connection := FConnection;
lTrn.StartTransaction;
lQry := TFDQuery.Create (Self);
lQry.Connection := FConnection;
lQry.Transaction := lTrn;
try
{ Execute command }
if Length (AParams) > 0
then lQry.ExecSQL (ASql, AParams)
else lQry.ExecSQL (ASql);
{ Commit transaction if started within the procedure }
lTrn.Commit;
except
on e:Exception
do begin
{ Rollback transaction if started within the procedure }
lTrn.Rollback;
//log
raise;
end;
end;
finally
lQry.DisposeOf;
lTrn.DisposeOf;
end;
end;


谢谢

最佳答案

尝试将Connection的属性SharedCache设置为“ False”,将LockingMode设置为“ Normal”。

连接的锁定模式的默认值为“独占”,这可能会导致此问题。您可以通过右键单击“连接组件”(在表单上)并选择ConnectionEditor(我不太确定,如果这是正确的英文单词,但是应该这样称呼)来完成此操作。设置这些值。

另外,您可以在源代码中设置以下属性:

connection.Params.Add('SharedCache=False');
connection.Params.Add('LockingMode=Normal');


我不确定这是否是解决此问题的最佳方法。对此可能会有更好的解决方案。

关于sqlite - SQLite数据库的Delphi Xe5 firedac数据库锁定错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22974832/

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