在 .Net 中检索 Firebird ODS 版本
Retrieve Firebird ODS version in .Net
我正在使用 firebird embedded v 2.5 和 .net FirebirdSql.Data.FirebirdClient。
我需要能够检索给定数据库的 ODS 版本。
我试过:
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"}
您可以使用 class 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 版本,与仅在 ODS 11.2 或更高版本上受支持的 RDB$GET_CONTEXT
相反。
您可以从二进制文件中获取 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
我正在使用 firebird embedded v 2.5 和 .net FirebirdSql.Data.FirebirdClient。 我需要能够检索给定数据库的 ODS 版本。
我试过:
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"}
您可以使用 class 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 版本,与仅在 ODS 11.2 或更高版本上受支持的 RDB$GET_CONTEXT
相反。
您可以从二进制文件中获取 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