Как читать данные типа метки времени с сервера SQL с помощью C#?
Я получаю результат в.NET, как это:
var lastRowVersion = SqlHelper.ExecuteScalar(connStr, CommandType.Text, "select
top 1 rowversion from dbo.sdb_x_orginfo order by rowversion desc");
Результатом является байтовый массив [0]= 0,[1]=0,[2]=0,[3]=0,[4]=0,[5]=0,[6]=30,[7]=138
, но результат в SQL Server 0x0000000000001E8A
,
Как я могу получить значение "0x0000000000001E8A"
в.NET?
6 ответов
Если вы просто хотите конвертировать byte[]
к System.Int64
(ака long
) затем используйте BitConverter.ToInt64
:
SqlBinary binary = /* ... */;
long value = BitConverter.ToInt64(binary.Value, 0); // 0 is the start index in the byte array
Чтобы отобразить его в виде шестнадцатеричной строки, вы можете использовать X
спецификатор формата, например:
Console.WriteLine("Value is 0x{0:X}.", value);
Я обнаружил, что byte[], возвращенный с сервера sql, имел неправильный Endian-ness и, следовательно, преобразование в long (Int64) не работало правильно. Я решил проблему, вызвав Reverse для массива перед передачей его в BitConverter:
byte[] byteArray = {0, 0, 0, 0, 0, 0, 0, 8};
var value = BitConverter.ToUInt64(byteArray.Reverse().ToArray(), 0);
Также я подумал, что лучше конвертировать в UInt64.
Вот одна строка:
var byteArray = new byte[] { 0, 0, 0, 0, 0, 0, 30, 138 };
var rowVersion = "0x" + string.Concat(Array.ConvertAll(byteArray, x => x.ToString("X2")));
Результат:
"0x0000000000001E8A"
Просто знайте, что есть другие варианты, которые работают лучше.
Так же, как "Ашиш Сингх", я вернулся на C# после преобразования в bigint на БД и использовал Int64 на стороне кода. Преобразование в long/Int64/UInt64 в C#/VB дало неправильные результаты (даже после обращения массива из-за проблемы с прямым порядком байтов).
Обратите внимание на стороне БД, что временная метка RowVersion имеет MIN_ACTIVE_ROWVERSION(), которая указывает последнюю зафиксированную временную метку
У меня работает нормально
var versionString = new StringBuilder();
versionString.Append("0x");
for (var i = 0; i < binary.Count(); i++)
{
versionString.Append(string.Format("{0:X}", binary[i]));
}
versionString.ToString(); // result
Вы можете использовать следующий запрос, который будет возвращать bigint вместо возврата hex.
select top 1 cast(rowversion as bigint) rowversion from dbo.sdb_x_orginfo order by rowversion desc