无法删除连接定义'它具有关联连接'

时间:2017-09-27 14:59:27

标签: multithreading delphi database-connection firedac delphi-10.2-tokyo

我的代码的设计时间为TFDConnection。设置参数,打开它,然后从中派生一个ConnectionDefinition以便以后使用(并发):

lParams.Assign(AConnection.Params);  (TStringList)
l := lParams.IndexOfName('Pooled');
if l <> -1 then
   lParams.Values['Pooled'] := 'true'
else
   lParams.Add('Pooled=true');
lConnName := AConnection.ConnectionName + 'Pooled';
if FDManager.IsConnectionDef(lConnName) then
   FDManager.DeleteConnectionDef(lConnName);
FDManager.AddConnectionDef(lConnName,AConnection.DriverName,lParams);

我有一个类型TTSQLScript

TTTSQLScripts = class(TComponent)
private
  FConn: TFDConnection;
  FScript: String;
public
  constructor Create(AOwner: TComponent; AConnection: TFDConnection); reintroduce;
  destructor Destroy; override;
  function Execute : Boolean;
  property Script : String read FScript write FScript;
end;

constructor TTTSQLScripts.Create(AOwner: TComponent; AConnection: TFDConnection);
begin
  inherited Create(AOwner);
  FConn := TFDConnection.Create(nil);
  // Pick up the pooled connection definition for concurrency:
  FConn.ConnectionDefName := AConnection.ConnectionName + 'Pooled';
  FConn.ResourceOptions.ParamExpand := false; 
  FScripts := TStringList.Create;
end;

destructor TTTSQLScripts.Destroy;
begin
  FConn.Close;
  FreeAndNil(FScripts);
  FreeAndNil(FConn);
  inherited;
end;

function TTTSQLScripts.Execute: Boolean;
begin
   try
      FConn.ExecSQL(FScript);
      Result := true;
   except
      Result := false;
   end;
end;

打开设计时连接后,我使用TTTSQLScripts组件:

lTTSQLScripts := TTTSQLScripts.Create(Application,ADataConnection);
lTTSQLScripts.Scripts.Text := 'some SQL';
lTTSQLScripts.Execute;
FreeAndNil(LTTSQLScripts);

问题

当我第二次设置我的设计时间TFDConnection时,在运行上述代码之后,FDManager.DeleteConnectionDef调用会触发:

  

[FireDac] [Stan] [Def] -251无法定义[xxxPooled]。它有关联的连接。

所以有些东西正在坚持连接,但我看不清楚。

上述构造中是否有不正确或可疑的东西导致此问题?,
或者:当我尝试删除定义时,我能否找到与“关联”相关的连接?

传递的所有AConnection个变量都是指我的设计时间TFDConnection

添加了:
我也尝试更改定义连接属性,但是一旦TTTScripts运行,它就会失败并出现相同的错误:

var lDefCon: IFDStanConnectionDef;
lDefCon := FDManager.ConnectionDefs.ConnectionDefByName(cPooledName);
lDefCon.Params.Assign(lParams);
lDefCon.Apply;

1 个答案:

答案 0 :(得分:0)

在设置新连接之前关闭FDManager似乎是最简单的解决方案。

很明显,这会有效,因为合并的连接也会被删除。

(这意味着我没有找到问题的根源,但我需要继续使用生产代码;我愿意花费一些限制来修补。因此我不会将此答案标记为 解决方案)。