在.net中检索火鸟ODS版本

本文关键字:ODS 版本 火鸟 检索 net | 更新日期: 2023-09-27 18:14:00

我使用firebird嵌入式v 2.5和。net FirebirdSql.Data.FirebirdClient。我需要能够检索给定数据库的ODS版本。

I have try:

private string GetOds(FbConnection connection)
{
  using (var cmd = new FbCommand())
  {
    var sqlQuery = "select rdb$get_context('SYSTEM','ENGINE_VERSION') as version from RDB$DATABASE";
    cmd.CommandText = sqlQuery;
    cmd.Connection = connection;
    cmd.CommandType = CommandType.Text;
    using (var reader = cmd.ExecuteReader()) // HERE ITS WHERE THE EXCEPTION IS GENERATED.
    {
     ...
    }
  }
}

这会产生一个异常:{"Dynamic SQL Error'r'nSQL Error code = -804'r'nFunction unknown'r'nRDB$GET_CONTEXT"}

在.net中检索火鸟ODS版本

您可以使用类FirebirdSql.Data.FirebirdClient.FbDatabaseInfo检索ODS版本,它包装了一个FbConnection,并可用于检索有关数据库的信息,例如:

using (var connection = new FbConnection(@"User=sysdba;Password=masterkey;Database=C:'path'to'your'database.fdb;DataSource=localhost"))
{
    connection.Open();
    var dbInfo = new FbDatabaseInfo(connection);
    Console.WriteLine("ODS Major: " + dbInfo.OdsVersion);
    Console.WriteLine("ODS Minor: " + dbInfo.OdsMinorVersion);
    Console.ReadLine();
}

这应该适用于Firebird支持的所有ODS版本,而RDB$GET_CONTEXT只支持ODS 11.2或更高版本

您可以从二进制文件中检索ODS版本。

private const ushort FirebirdFlag = 0x8000;
private void DispObsVersinoFromBinary(string path)
{
    using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read))
    {
        int fileSize = (int)fs.Length;
        byte[] buf = new byte[1024];
        fs.Read(buf, 0, 1024);
        var obsHex = string.Join("", buf.Skip(0x12).Take(2).Select(x => x.ToString("X2")).Reverse());
        var minor = string.Join("", buf.Skip(0x40).Take(2).Select(x => x.ToString("X2")).Reverse());
        Console.WriteLine($"ODSVer:{Convert.ToInt32(obsHex, 16) & ~FirebirdFlag}");
        Console.WriteLine($"ODSMinorVer:{Convert.ToInt32(minor, 16)}");
    }
}

和其他样式
https://github.com/kowill/Sample/blob/master/fb3test/Fb3Test/Program.cs L71-L82