Как читать данные типа метки времени с сервера SQL с помощью C #? - PullRequest
12 голосов
/ 08 ноября 2011

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

24 голосов
/ 25 января 2013

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

5 голосов
/ 08 ноября 2011

Если вы просто хотите преобразовать 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);
2 голосов
/ 12 июля 2017

Вот одна строка:

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"

Просто помните, что есть другие опции, которые работают лучше .

0 голосов
/ 29 февраля 2016

отлично работает у меня

  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
0 голосов
/ 03 марта 2015

То же, что и «Ашиш Сингх». Я вернулся на c # после преобразования в bigint на БД и использовал Int64 на стороне кода.Преобразование в long / Int64 / UInt64 в c # / VB дало неправильные результаты (даже после обращения массива из-за незначительной проблемы с порядком байтов).

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

0 голосов
/ 20 апреля 2014

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

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

...