1

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

谢谢

4

3 回答 3

3

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

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

或者,您可以在源代码中设置这些属性:

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

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

于 2015-03-16T08:53:26.187 回答
0

Sharedcache = false 确实是解决这个问题的最好办法。这些组件已经支持设计时连接。

于 2019-08-16T10:43:29.583 回答
0

因为存在其他连接。检查数据模块 MyFDConnection.Connected:=False 中的连接组件;

于 2019-03-07T12:44:23.333 回答