在64位Linux环境中使用firebird嵌入式工作获得Mono

时间:2016-05-10 13:32:58

标签: c# linux mono firebird firebird-embedded

我正在尝试使用firebird .net提供程序(FirebirdSql.Data.FirebirdClient)在Linux上运行Firebird嵌入式2.5(64位)。

我的Test程序集的FB嵌入式设置正在使用Windows Firebird Embedded版本的WinX86_64。 在Linux上,我在汇编目录中使用相应的FB嵌入式Linux版本放置文件:

  • libfbembed.so *
  • firebird.msg
  • security2.fdb
  • libicu *
  • libib *

将“RootDirectory”设置为firebird.conf中的程序集目录。 将shell环境变量LD_LIBRARY_PATH和FIREBIRD设置为汇编目录。

        FbConnectionStringBuilder conn = new FbConnectionStringBuilder();            
        conn.Database = @"/home/dev/firebirdTest/1stDB.FDB";
        conn.ServerType = FbServerType.Embedded;
        conn.UserID = "SYSDBA";
        conn.Password = "masterkey"; 
        conn.Charset = "UTF8";
        conn.DataSource = "localhost";
        conn.ClientLibrary = "libfbembed.so";
        string connStr = conn.ConnectionString;
        var dbcon = new FbConnection(connStr);
        FbConnection.CreateDatabase(connStr, pageSize: 8192, forcedWrites: true, overwrite: false);
        dbcon = new FbConnection(connStr);
        dbcon.Open();
我之前做过的事情:

  • 通过mono dllmap重定向Firebird Clientlibrary不起作用。通过在C#代码中显式设置ClientLib来解决。
  • 在Linux上手动创建带有isql的数据库。
  • 通过Linux上的代码创建数据库。
  • Firebird .NET提供程序在调试模式下创建FB_ {sanitizedName} .dll和DynamicAssembly.dll
  • .NET提供程序真的很安静。通过在linux上使用“strace mono {testAssembly.exe}”启动程序集来完成调试。
  • 如果pagesize不是8192,则在“打开O_CREAT”(调用FbCreateDatabase)期间FbConnection.CreateDatabase会因I / O错误而崩​​溃。将显式pagesize设置为8192可解决此问题。

现在,我遇到了以下错误(并且在这里停留了好几天......):

  • 打开现有的数据库文件(如此处的代码),崩溃为:

    FirebirdSql.Data.FirebirdClient.FbException:无效的数据库句柄(无活动连接)--->无效的数据库句柄(无活动连接)

出了什么问题?

2 个答案:

答案 0 :(得分:0)

我也坚持这个错误。 FirebirdSql.Data.FirebirdClient.FbException:数据库句柄无效(无活动连接) 试过FB 2.5。*和3.0.0的结果是一样的。 还尝试使用FB的调试版本。日志没有帮助。

也许有人在这里知道问题是什么?

答案 1 :(得分:0)

距最初的帖子已经3年了,我遇到了同样的问题。我没有“答案”,但有一个解释。看来,SafeHandle对象的编组并没有完全在mono中实现。从他们在SafeHandle上的文档中:“请注意,“ ref SafeHandles”将指向包含零个P / Invoked方法的插槽的指针传递给指针,并在返回时使用返回的值创建一个新的SafeHandle。“ ref SafeHandles”实际上并没有获得原始的SafeHandle.handle值。”

如果您在IFbClient中查看FirebirdClient源代码,则会看到P / Invoke声明如下:

    IntPtr isc_detach_database(
        [In, Out] IntPtr[] statusVector,
        [MarshalAs(UnmanagedType.I4)] ref DatabaseHandle dbHandle);

DatabaseHandle是从SafeHandle派生的,因此第二个参数是“ ref SafeHandle”参数,并且存在上述问题-它基本上将传递零而不是实际的句柄值。

除了(a)改进单声道中的SafeHandle实现或(b)重写FirebirdClient以避免使用SafeHandles之外,没有其他解决方法。