我的应用程序的设计时间为TFDConnection
,TFDPhysFBDriverLink
为源连接。这可能会或可能不会在Firebird嵌入模式下打开(如果是,FDPhysFBDriverLink.VendorLib := 'fbembed.dll'
已设置(32位)。)
我创建了一个运行时目标TFDConnection
,其中必须使用嵌入式Firebird,因为我们不知道Firebird是否安装在PC上(我们的设置供应fbembed.dll
)。
如何设置?在运行时,我可以创建另一个TFDPhysFBDriverLink
并设置其VendorLib,但FireDAC如何知道其关联连接是什么?或者我可以在应用程序中只使用一个FDPhysFBDriverLink
吗?
这是我使用DirectSQL转换的旧代码,这也用于设置一些魔术SDFib.SqlApiDLL := FBEMBED
属性,该属性据说仅适用于目标数据库。
答案 0 :(得分:1)
在您的情况下,最糟糕的情况是安装了Firebird,因此一个连接连接到已安装的服务器实例,而另一个连接连接到嵌入式服务器实例。因为这足以拥有一个物理驱动程序对象,但是有更多的没有问题。
因此,在表单或数据模块上放一个TFDPhysFBDriverLink并将其DriverID属性设置为唯一名称(不用作任何驱动程序的基本驱动程序ID),并将其标记为{{ 3}}(当你在此时指定Embedded时没有实际意义,但你可以使用它来识别驱动程序; FireDAC仅使用此属性来决定应该加载哪个默认库)。
然后,对于一个连接,使用您定义的VendorLib,并使用其DriverID使用回退到默认的Firebird驱动程序设置(我省略了此任务不必要的设置):
FDPhysFBDriverLink1.DriverID := 'FBEmbedded'; { ← ID not used by any BaseDriverID }
FDPhysFBDriverLink1.Embedded := True; { ← not mandatory when VendorLib is specified }
FDPhysFBDriverLink1.VendorLib := 'C:\fbembed.dll'; { ← client library file name }
FDConnection1.Params.DriverID := 'FB'; { ← driver's BaseDriverID }
FDConnection1.Open; { ← this will connect to the installed server }
FDConnection2.Params.DriverID := 'FBEmbedded'; { ← driver's DriverID }
FDConnection2.Open; { ← this will connect to the embedded server }
但我更喜欢有两个单独的驱动程序对象,一个用于已安装的服务器(具有默认设置,如基本驱动程序)和一个用于嵌入式服务器。例如:
FDPhysFBDriverLink1.DriverID := 'FBEmbedded'; { ← ID not used by any BaseDriverID }
FDPhysFBDriverLink1.Embedded := True; { ← not mandatory when VendorLib is specified }
FDPhysFBDriverLink1.VendorLib := 'C:\fbembed.dll'; { ← client library file name }
FDPhysFBDriverLink2.DriverID := 'FBInstalled'; { ← ID not used by any BaseDriverID }
FDConnection1.Params.DriverID := 'FBEmbedded'; { ← driver 1 DriverID }
FDConnection1.Open; { ← this will connect to the embedded server }
FDConnection2.Params.DriverID := 'FBInstalled'; { ← driver 2 DriverID }
FDConnection2.Open; { ← this will connect to the installed server }