12

我在 .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 中获得价值?

4

6 回答 6

24

我发现从 sql server 返回的 byte[] 有错误的字节序,因此转换为 long (Int64) 不能正常工作。在将数组传递给 BitConverter 之前,我通过在数组上调用 Reverse 解决了这个问题:

byte[] byteArray = {0, 0, 0, 0, 0, 0, 0, 8};

var value = BitConverter.ToUInt64(byteArray.Reverse().ToArray(), 0);

另外,我认为最好转换为 UInt64。

于 2013-01-24T23:56:44.427 回答
5

如果您只想转换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);
于 2011-11-08T06:35:14.750 回答
2

这是一个单行:

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"

请注意,还有其他性能更好的选项

于 2017-07-12T16:31:23.080 回答
0

您可以使用以下查询,它将返回 bigint 而不是返回十六进制。

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

于 2014-04-20T18:37:53.367 回答
0

与“Ashish Singh”相同,我在 DB 上转换为 bigint 并在代码端使用 Int64 后返回 c#。在 c#/VB 中转换为 long/Int64/UInt64 给出了错误的结果。(即使在反转数组后,由于小端问题。)

在数据库端注意 RowVersion 时间戳有 MIN_ACTIVE_ROWVERSION() ,它表示最后提交的时间戳

于 2015-03-03T13:14:56.680 回答
0

对我来说很好

  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
于 2016-02-29T10:37:41.797 回答