1

我正在尝试从 .NET 项目连接到 Firebird 3 嵌入式数据库。我已将 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.CreateNewConnectionIfPossibleImpl(FbConnectionString connectionString)
在 FirebirdSql.Data.FirebirdClient.FbConnectionPoolManager.Pool.GetConnection(FbConnection owner)
在 FirebirdSql.Data.FirebirdClient .FbConnection.Open()
在 DZApp.LoginForm.CheckPassword(String v1, String v2, String v3) 在 C:\Users\DZ\Desktop\DZApp\DZApp\LoginForm.cs:line 89

我知道密码不是必需的,并且已将其删除,但它不起作用,可能是什么问题?

4

1 回答 1

3

当一个简单的应用程序使用 fbclient.dll 访问 Firebird Embedded,而是在搜索路径上加载 fbclient.dll(例如在 C:\Windows\System32 或 C:\ Windows\SysWoW64(如果应用程序是 32 位)。

在该模式下,fbclient 尝试通过 XNET 协议(即通过xnet://Global\FIREBIRD)建立到 Firebird 实例的“本地”连接。当没有 Firebird 正在运行时,这将失败。

在我尝试重现这一点时,我发现以下条件可以触发这一点:

  • fbclient.dll部署在应用程序的文件夹中,没有Firebird Embedded 的其余部分:

    fbclient 尝试通过 XNET 创建本地连接,但失败了。

  • 嵌入式引擎 ( engine12.dll) 不存在或位置错误。如果fbclient.dllC:\path\to\firebird\fbclient.dll,那么engine12.dll应该在C:\path\to\firebird\plugins\engine12.dll

    fbclient 尝试通过 XNET 创建本地连接,但失败了。

    这是上一项的明确示例。

  • fbclient.dll未部署在应用程序的文件夹中

    而是使用路径上的 fbclient(例如在 Windows\System32 或 SysWoW64 中),它尝试通过 XNET 创建本地连接,但失败了。

    当路径上DllNotFoundException没有适当的位数时,这种情况将触发 a 。fbclient.dll

  • fbclient.dll+ Firebird 嵌入的位数与应用程序不同(例如 x86 或 AnyCPU 应用程序与 64 位 Firebird,或 x64 应用程序与 32 位 Firebird)

    取而代之的是使用路径上具有适当位数的 fbclient(例如在 Windows\System32 或 SysWoW64 中),它尝试通过 XNET 创建本地连接,但失败了。

    当路径上BadImageFormatException没有适当的位数时,这种情况可能会触发 a 。fbclient.dll

顺便说一句:在这些情况下,如果 Firebird 实例正在运行,则会导致错误“与数据库的连接丢失”,这可能是因为 Firebird ADO.net 提供程序没有提供密码,因为 Firebird Embedded 不需要它(虽然我还没有验证),而本地连接可以。

简而言之:

  • 确保 Firebird Embedded 与您的应用程序一起正确部署,并且
  • 确保 Firebird Embedded 具有适合您的应用程序的正确位数。

    这意味着,对于 C# x86 或 AnyCPU:32 位,对于 x64:64 位。或者对于 AnyCPU,在 Program Properties > Build for Platform target: AnyCPU 中禁用“Prefer 32-bit”,以确保它改为加载 64 位 DLL。

有效的 Firebird 3 Embedded 部署所需的文件是(引自我写的一篇关于从 Java 中使用 Firebird Embedded 的博文):

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 安装的精简版。文件夹中的某些 DLLplugins 可能不是必需的(这可能需要调整firebird.conf),并且错误记录表明它可能也需要包含 ib_util.dll,但示例程序在没有它的情况下也可以工作。如果您需要其他配置,则可以包含一个 firebird.conf.

与引用树中显示的相反,文件夹engine12.dll中真正需要的是。plugins

于 2018-12-19T14:12:48.230 回答