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

时间:2018-12-17 15:09:38

标签: 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):
  无法完成网络请求以托管“ 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所有者)
  在FirebirdSql.Data.FirebirdClient.FbConnection.Open()
  在C:\ Users \ DZ \ Desktop \ DZApp \ DZApp \ LoginForm.cs:line 89

中的DZApp.LoginForm.CheckPassword(String v1,String v2,String v3)

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

1 个答案:

答案 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与您的应用程序一起正确部署,并且
  • 确保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