我正在尝试从 .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 行
我知道密码不是必需的,并且已将其删除,但它不起作用,可能是什么问题?
我可以用一个简单的应用程序重现此错误,当它不使用可访问 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 具有适合您的应用程序的正确位数。
这意味着,对于 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
文件夹是普通 Firebird 的精简版本 安装。fb
中的某些 DLL 可能是 文件夹不是必需的(这可能需要调整plugins
), 错误日志表明可能有必要包括firebird.conf
也是如此,但是示例程序在没有它的情况下也可以工作。如果 您需要额外的配置,然后您可以包括ib_util.dll
。firebird.conf
与引用的树中显示的相反,在
engine12.dll
文件夹中真正需要的是 plugins
。