我正在尝试从.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()中中的DZApp.LoginForm.CheckPassword(String v1,String v2,String v3)
在FirebirdSql.Data.FirebirdClient.FbConnectionPoolManager.Pool.CreateNewConnectionIfPossibleImpl(FbConnectionString connectionString)
在FirebirdSql.Data.FirebirdClient.FbConnectionPoolManager.Pool.GetConnection(FbConnection所有者)
在FirebirdSql.Data.FirebirdClient.FbConnection.Open()
在C:\ Users \ DZ \ Desktop \ DZApp \ DZApp \ LoginForm.cs:line 89
我知道该密码不是必需的,因此已将其删除,但它不起作用,这可能是什么问题?
答案 0 :(得分:2)
当我不不使用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.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与应用程序(例如x86或具有64位Firebird的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,请在“程序属性”>“为平台构建”目标中禁用“首选32位”:AnyCPU以确保加载64位DLL。
运行Firebird 3 Embedded所需的文件是(引自我写过关于使用Java的Firebird Embedded的a blogpost的引用):
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
。