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

标签 c# sql database firebird firebird-embedded

我正在尝试从 .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):
Unable to complete network request to host "xnet://Global\FIREBIRD".

Unable to complete network request to host "xnet://Global\FIREBIRD".

at FirebirdSql.Data.FirebirdClient.FbConnectionInternal.Connect()
at FirebirdSql.Data.FirebirdClient.FbConnectionPoolManager.Pool.CreateNewConnectionIfPossibleImpl(FbConnectionString connectionString)
at FirebirdSql.Data.FirebirdClient.FbConnectionPoolManager.Pool.GetConnection(FbConnection owner)
at FirebirdSql.Data.FirebirdClient.FbConnection.Open()
at DZApp.LoginForm.CheckPassword(String v1, String v2, String v3) in C:\Users\DZ\Desktop\DZApp\DZApp\LoginForm.cs:line 89

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

最佳答案

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

在该模式下,fbclient 尝试通过 XNET 协议(protocol)(即通过 xnet://Global\FIREBIRD)与 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 部署在应用程序的文件夹中:

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

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

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

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

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

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

简而言之:

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

    这意味着,对于 C# x86 或 AnyCPU:32 位,对于 x64:64 位。或者对于 AnyCPU,在程序属性 > 为平台目标构建:AnyCPU 中禁用“首选 32 位”,以确保它改为加载 64 位 DLL。

有效的 Firebird 3 Embedded 部署所需的文件是(引自 a blogpost 我写过关于从 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

The fb folder is a trimmed down version of a normal Firebird installation. It is possible that some of the DLLs in the plugins folder are not necessary (this may require tweaking firebird.conf), and error logging suggests it might be necessary to include ib_util.dll as well, but the example program works without it. If you need additional configuration, then you can include a firebird.conf.

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

关于c# - 连接到 .NET 中嵌入了 C# 的 Firebird 3 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53817952/

相关文章:

MySql:如何在嵌套查询中使用 `show` 命令的输出?

php - 在没有数据库的情况下永久保存 php 变量

c# - .net 中的 PayPal 定期付款

c# - Java 的 getAndSet 的 c# 等价物是什么

c# - 重复调用 CellValueNeeded

sql - 按 MS Access 中的连续日期分组

c# - 如何检查用户是否登录数据库C#

sql - Laravel Controller 在 save() 处插入两个 id 列

c# - 如何以编程方式 (C#) 确定 .docx 文件的页数

javascript - 更新返回匹配