Настройка второго TFDPhysFBDriverLink — можно и нужно?

Мое приложение имеет время разработки TFDConnection и TFDPhysFBDriverLink в качестве исходного соединения. Он может открываться или не открываться во встроенном режиме Firebird (если да, то устанавливается FDPhysFBDriverLink.VendorLib := 'fbembed.dll' (32 бита)).

Я создаю цель времени выполнения TFDConnection, которая должна использовать встроенный Firebird, потому что мы не знаем, установлен ли Firebird на ПК (наша установка предоставляет fbembed.dll).

Как мне это настроить? Во время выполнения я могу создать еще один TFDPhysFBDriverLink и установить его VendorLib, но как FireDAC узнает, какое у него связанное соединение? Или я могу использовать только один FDPhysFBDriverLink в приложении?

Это старый код, который я конвертирую, используя DirectSQL, и он также используется для установки некоторой магии SDFib.SqlApiDLL := FBEMBED свойство, которое предположительно работало только для целевой базы данных.


person Jan Doggen    schedule 11.10.2017    source источник


Ответы (1)


В худшем случае в вашей ситуации это то, что Firebird установлен, поэтому одно соединение подключается к этому установленному экземпляру сервера, а другое - к встроенному. Для этого достаточно иметь один физический объект драйвера, но нет проблем и с большим количеством.

Итак, бросьте одну TFDPhysFBDriverLink в форме или модуле данных и настройте его DriverID на уникальное имя (которое не используется в качестве базового идентификатора драйвера для какого-либо драйвера) и пометьте его как Встроенный (не имеет практического смысла в случае, когда вы указываете VendorLib в настоящее время, но вы можете использовать его для идентификации драйвера; FireDAC использует это свойство только для решения, какую библиотеку по умолчанию следует загрузить).

Затем для одного соединения используйте DriverID который вы определили, а для другого используйте откат к настройкам драйвера Firebird по умолчанию, используя его BaseDriverID (я пропустил настройки, ненужные для этой задачи):

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 }
person Victoria    schedule 11.10.2017
comment
Что делает свойство Embedded? Я не могу найти документацию (Embarcadero Technologies в настоящее время не располагает дополнительной информацией) - person Jan Doggen; 13.10.2017
comment
Он загружает только библиотеку fbembed.dll вместо fbclient.dll в случае, если VendorLib не установлено. В данном случае это бесполезно (потому что вы укажете VendorLib), но я использовал его для возможных дополнений в будущем (и вы можете использовать его для идентификации вашего драйвера). - person Victoria; 13.10.2017
comment
Хорошо, это работает, спасибо. Я использую два разных TFDPhysFBDriverLinks. Я заметил одну вещь: я не должен оба назначать DriverName и DriverID. - person Jan Doggen; 13.10.2017
comment
Пожалуйста! Итак, DriverName очищает определение соединения и устанавливает DriverID в Params. Установка свойства DriverID (или установка его как пара ключ-значение DriverID=FBEmbedded) устанавливает только DriverID в Params. - person Victoria; 13.10.2017