我的代码的设计时间为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;
答案 0 :(得分:0)
在设置新连接之前关闭FDManager似乎是最简单的解决方案。
很明显,这会有效,因为合并的连接也会被删除。
(这意味着我没有找到问题的根源,但我需要继续使用生产代码;我愿意花费一些限制来修补。因此我不会将此答案标记为 解决方案)。