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

标签 sqlite delphi firedac database-locking

我试图创建一个简单的对象来处理我所有与数据库相关的功能。我有一个返回数据集或执行命令的函数。现在,当我从程序中调用它时,我可以使用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/

相关文章:

c# - SQLite3 中存储过程的替代方案

c++ - SQLITE:如何在 UPDATE 语句中使用 SELECT 语句更新表?

java - 我为本地 sqlite 数据库创建了应​​用程序,但它没有运行。请告诉我解决方案

delphi - 覆盖Tpanel.MouseDown以更改颜色

delphi - 如何使用 FireDAC 提取存储过程 DDL

delphi - 在 Delphi 中,有一种使用 FireDAC 备份和恢复数据库的方法

android - onUpgrade() 方法无法正常工作

Delphi - 编译器指令多行影响选定的 IDE 错误行

mysql - delphi 10.1 fdconnection libmysql.dll

delphi - 可扩展的 Delphi TCP 服务器实现