Как читать данные типа timestamp с сервера sql с помощью С#?

Я получаю результат в .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?

Ответ 1

Если вы просто хотите преобразовать byte[] в System.Int64 (aka 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);

Ответ 2

Я обнаружил, что байт [], возвращенный с сервера 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.

Ответ 4

Вы можете использовать следующий запрос, который вернет bigint вместо возврата hex.

select top 1 cast(rowversion as bigint) rowversion from dbo.sdb_x_orginfo order by rowversion desc

Ответ 5

То же, что и "Ashish Singh", я вернулся в С# после преобразования в bigint в DB и использовал Int64 на стороне кода. Преобразование в long/Int64/UInt64 в С#/VB дало неверные результаты (даже после реверсирования массива из-за маленькой конечной проблемы.)

Обратите внимание на сторону БД, что временная метка RowVersion имеет MIN_ACTIVE_ROWVERSION(), которая указывает последнюю отмеченную метку времени

Ответ 6

Прекрасно работает для меня

  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