我的应用程序有一个设计TFDConnection
时间,当它连接到另一个数据库(类型)时会被重用。
我还从其设置中派生了一个池连接,并将其注册FDManager.AddConnectionDef
为在多线程时使用(如这里)。
第二次设置时,我不小心AddConnectionDef
用相同的 ConnectionDefName 再次调用。文档说:
该名称在 ConnectionDefs 列表中的其他连接定义中必须是唯一的,否则会引发异常。
这不会发生。没有例外,我最终得到了两个同名的 ConnectionDef。
对于那些好奇的人:下一个代码块演示了这种行为(质量门户上的 RSP-19107)。这不是我的直接问题,因为我想好吧,然后我DeleteConnectionDef
先删除旧的。
但事实证明,这也行不通。请参阅第二个代码块。
procedure TFrmFireDACConnectionNames.BtnBug1Click(Sender: TObject);
var
lParams: TStringList;
i,l : integer;
begin
lParams := TStringList.Create;
lParams.Add('User_Name=sysdba');
lParams.Add('Password=masterkey');
lParams.Add('database=D:\Testing\test.gdb');
lParams.Add('Server=localhost');
lParams.Add('Pooled=true');
lParams.Add('DriverID=FB');
FDManager.AddConnectionDef('FBPooled','FB',lParams);
lParams.Values['database'] := 'D:\Testing\test2.gdb';
FDManager.AddConnectionDef('FBPooled','FB',lParams);
// This shows the two identical ConnectionDefs (inspect lParams):
lParams.Clear;
l := FDManager.ConnectionDefs.Count;
for i := 0 to l-1 do
lParams.Add(FDManager.ConnectionDefs[i].Name);
// Contents on my machine:
// Access_Demo
// Access_Demo_Pooled
// DBDEMOS
// EMPOYEE
// MSSQL_Demo
// RBDemos
// SQLite_Demo
// SQLite_Demo_Pooled
// FBPooled <== Duplicates
// FBPooled
// To check that the two added have their respective Params, inspect lParams with breakpoints on the lines below:
lParams.Assign(FDManager.ConnectionDefs[l-1].Params);
// Contents on my machine:
// User_Name=sysdba
// Password=masterkey
// database=D:\Testing\test2.gdb
// Server=localhost
// Pooled=true
// DriverID=FB
// Name=FBPooled
lParams.Assign(FDManager.ConnectionDefs[l-2].Params);
// Contents on my machine:
// User_Name=sysdba
// Password=masterkey
// database=D:\Testing\test.gdb
// Server=localhost
// Pooled=true
// DriverID=FB
// Name=FBPooled
lParams.Free;
end;
下面是演示DeleteConnectionDef
失败的示例代码。请注意,我什至不使用或打开TFDConnection
.
procedure TFrmFireDACConnectionNames.BtnDeleteTestClick(Sender: TObject);
var
lParams : TStringList;
i,l : integer;
lConnName: String;
begin
lParams := TStringList.Create;
lConnName := 'MyConnPooled';
lParams.Add('DriverID=FB');
lParams.Add('User_Name=sysdba');
lParams.Add('Password=masterkey');
lParams.Add('Database=d:\Testing\Diverse\FireDACConnectionNames\test.gdb');
lParams.Add('Server=localhost');
lParams.Add('Pooled=true');
FDManager.AddConnectionDef(lConnName,'FB',lParams);
lParams.Clear;
lParams.Add('DriverID=MSSQL');
lParams.Add('User_Name=test');
lParams.Add('Password=test');
lParams.Add('Database=test');
lParams.Add('Server=VS20032008');
lParams.Add('Pooled=true');
for l := FDManager.ConnectionDefs.Count-1 downto 0 do
if FDManager.ConnectionDefs[l].Name = lConnName then
begin
FDManager.DeleteConnectionDef(lConnName); // This gets executed
Break;
end;
FDManager.AddConnectionDef(lConnName,'MSSQL',lParams);
// Check ConnectionDefs (inspect lParams):
lParams.Clear;
l := FDManager.ConnectionDefs.Count;
for i := 0 to l-1 do
lParams.Add(FDManager.ConnectionDefs[i].Name);
// Contents on my machine:
// Access_Demo
// Access_Demo_Pooled
// DBDEMOS
// EMPLOYEE
// MSSQL_Demo
// RBDemos
// SQLite_Demo
// SQLite_Demo_Pooled
// MyConnPooled <== Still duplicate
// MyConnPooled
lParams.Free;
end;
那么这里会发生什么,我该如何解决这个问题?
这是 Delphi Tokyo 10.2.1
如果您想运行此代码,请在表单上放置一个TFDPhysFBDriverLink
和。TFDPhysMSSQLDriverLink
我尝试在那些上调用 .Release,但这并没有帮助。
更正:运行代码不需要放置 TFDPhysxxxDriverLink 组件。我留下这句话是因为它们相关单元的存在对于 AddConnectionDefinition 错误是必不可少的(请参阅批准的答案)。
已解决的问题:该RSP-19107链接上的补丁FireDAC.Stan.Def.pas
和FireDAC.Comp.Client.pas
可用的补丁。