连接到在 .NET 中嵌入 C# 的 Firebird 3 时出现问题

问题描述 投票:0回答: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 连接字符串)
在FirebirdSql.Data.FirebirdClient.FbConnectionPoolManager.Pool.GetConnection(FbConnection所有者)
在 FirebirdSql.Data.FirebirdClient.FbConnection.Open()
在 C:\Users\DZ\Desktop\DZApp\DZApp\LoginForm.cs 中的 DZApp.LoginForm.CheckPassword(String v1, String v2, String v3):第 89 行

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

c# firebird firebird-embedded firebird-.net-provider
1个回答
3
投票

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

在该模式下,fbclient 尝试通过 XNET 协议(即通过

xnet://Global\FIREBIRD
)建立与 Firebird 实例的“本地”连接。当没有 Firebird 运行时,此操作会失败。

在我尝试重现此问题时,我发现以下条件可以触发此问题:

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

    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
    部署在应用程序的文件夹中:

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

    当路径上没有适当位数的

    DllNotFoundException
    时,这种情况将触发
    fbclient.dll

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

    使用路径上具有适当位数的 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,请在“程序属性”>“针对平台目标构建:AnyCPU”中禁用“首选 32 位”,以确保它改为加载 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 的精简版本 安装。
plugins
中的某些 DLL 可能是 文件夹不是必需的(这可能需要调整
firebird.conf
), 错误日志表明可能有必要包括
ib_util.dll
也是如此,但是示例程序在没有它的情况下也可以工作。如果 您需要额外的配置,然后您可以包括
firebird.conf

与引用的树中显示的相反,在

engine12.dll
文件夹中真正需要的是
plugins

© www.soinside.com 2019 - 2024. All rights reserved.