Я могу воспроизвести эту ошибку с помощью простого приложения, когда оно не использует fbclient.dll с доступом к Firebird Embedded, но вместо этого загружает fbclient.dll в путь поиска (например, в C: \ Windows \ System32 или C: \ Windows \ SysWoW64, если приложение 32-разрядное).
В этом режиме fbclient пытается установить «локальное» подключение к экземпляру Firebird через протокол XNET (то естьдо xnet://Global\FIREBIRD
).Когда Firebird не запущен, это не работает.
В моих попытках воспроизвести это я обнаружил, что следующие условия могут вызвать это:
Только fbclient.dll
развернутый в папке приложения без остальная часть Firebird Embedded:
fbclient пытается создать локальное соединение через XNET, которое завершается неудачей.
Встроенный двигатель (engine12.dll
) отсутствует или находится в неправильном месте.Если fbclient.dll
в C:\path\to\firebird\fbclient.dll
, то engine12.dll
должно быть в C:\path\to\firebird\plugins\engine12.dll
fbclient пытается создать локальное соединение через XNET, которое завершается неудачей.
Это явный примерпредыдущего элемента.
fbclient.dll
is not развернуто в папке приложения:
fbclient на пути (например, в WindowsВместо него используется \ System32 или SysWoW64), который пытается создать локальное соединение через XNET, что не удается.
В этом случае вместо этого будет DllNotFoundException
, когда на 1064 * *путь.
fbclient.dll
+ Встраиваемые Firebird имеют разную битность по сравнению с приложением (например, приложение x86 или AnyCPU с 64-битным Firebird или приложение x64 с 32-битным Firebird)
Вместо этого используется fbclient с соответствующей битовой скоростью в пути (например, в Windows \ System32 или SysWoW64), который пытается создать локальное соединение через XNET, что не удается.
В этом случае может возникнуть BadImageFormatException
вместо того, когдаfbclient.dll
соответствующей битности на пути нет.
В качестве отступления: при этих условиях, если запущен экземпляр Firebird, это приведет к ошибке вместо этого "соединение потеряно с базой данных" , вероятно, потому что поставщик Firebird ADO.net не предоставляет пароль, поскольку Firebird Embedded не нуждается в нем (хотя я не проверял это), в то время как локальное соединение делает.
Вкратце:
- обеспечивает правильное развертывание Firebird Embedded вместе с вашим приложением, а
гарантирует, что Firebird Embedded имеет правильную разрядность для вашего приложения.
Это означает, что для C # x86 или AnyCPU: 32 бита, для x64: 64 бита.Или для AnyCPU отключите «Предпочитать 32-битный» в разделе «Свойства программы»> «Построить для платформы»: AnyCPU, чтобы вместо этого загрузить 64-битные DLL.
Файлы, необходимые для работающего Firebird3 Встроенное развертывание (цитата из блога , о котором я писал об использовании Firebird Embedded из Java):
fb
|--intl
| |--fbintl.conf
| \--fbintl.dll
|--plugins
| |--engine12.dll
| |--fbtrace.dll
| |--legacy_auth.dll
| |--legacy_usermanager.dll
| |--srp.dll
| |--udr_engine.conf
| \--udr_engine.dll
|--fbclient.dll
|--icudt52.dll
|--icudt52l.dll
|--icuin52.dll
\--icuuc52.dll
Папка fb
является урезанной версией обычногоУстановка Firebird.Возможно, что некоторые библиотеки DLL в папке plugins
не являются необходимыми (для этого может потребоваться настройка firebird.conf
), и регистрация ошибок предполагает, что может потребоваться также включить ib_util.dll
, но пример программы работает без него.,Если вам нужна дополнительная конфигурация, вы можете включить firebird.conf
.
В отличие от того, что показано в цитируемом дереве, в папке plugins
действительно требуется только engine12.dll
.