我正在尝试使用firebird .net提供程序(FirebirdSql.Data.FirebirdClient)在Linux上运行Firebird嵌入式2.5(64位)。
我的Test程序集的FB嵌入式设置正在使用Windows Firebird Embedded版本的WinX86_64。 在Linux上,我在汇编目录中使用相应的FB嵌入式Linux版本放置文件:
将“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();
我之前做过的事情:
现在,我遇到了以下错误(并且在这里停留了好几天......):
打开现有的数据库文件(如此处的代码),崩溃为:
FirebirdSql.Data.FirebirdClient.FbException:无效的数据库句柄(无活动连接)--->无效的数据库句柄(无活动连接)
出了什么问题?
答案 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之外,没有其他解决方法。