Проблема с подключением к Firebird 3, встроенному в C # в .NET - PullRequest
0 голосов
/ 17 декабря 2018

Я пытаюсь подключиться к встроенной базе данных Firebird 3 из проекта .NET.Я скопировал все файлы Firebird в исполняемый каталог приложения.Я использовал следующий построитель строки подключения:

            var builder = new FbConnectionStringBuilder()
            {
                UserID = v1,
                Password = v2,
                Database = v3,
                ServerType = FbServerType.Embedded,
                Charset = "UTF8",
                ClientLibrary = "fbclient.dll" 
            };

Однако я получаю следующую ошибку подключения

FirebirdSql.Data.FirebirdClient.FbException (0x80004005):
Невозможно выполнитьзавершить сетевой запрос к хосту "xnet: // Global \ FIREBIRD".

Невозможно выполнить сетевой запрос к хосту "xnet: // Global \ FIREBIRD".

в FirebirdSql.Data.FirebirdClient.FbConnectionInternal.Connect ()
в FirebirdSql.Data.FirebirdClient.FbConnectionPoolManager.Pool.CreateNewConnectionIfPossibleImpird.ob_PF.GetConnection (владелец FbConnection)
в FirebirdSql.Data.FirebirdClient.FbConnection.Open ()
в DZApp.LoginForm.CheckPassword (строка v1, строка v2, строка v3) в C: \ Users \ DZ \ Desktop \DZApp \ DZApp \ LoginForm.cs: строка 89

Я знаю, что пароль не нужен и удалил его, но он не работает, в чем может быть проблема?

1 Ответ

0 голосов
/ 19 декабря 2018

Я могу воспроизвести эту ошибку с помощью простого приложения, когда оно не использует 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.

...