C# 如何使用C从sql server读取时间戳类型的数据?

C# 如何使用C从sql server读取时间戳类型的数据?,c#,timestamp,rowversion,C#,Timestamp,Rowversion,我在.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中的结果是0x0000000

我在.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


如何在.NET中获取值0x0000000000001E8A?

如果您只想将字节[]转换为System.Int64或long,请使用:

要将其显示为十六进制字符串,可以使用X,例如:


我发现从sql server返回的字节[]的尾数不正确,因此无法正确转换为长Int64。在将数组传递到位转换器之前,我通过在数组上调用Reverse解决了这个问题:

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

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

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

您可以使用下面的查询返回bigint而不是hex


从dbo.sdb_x_orginfo顺序中按rowversion desc选择前1个castrowversion作为bigint rowversion,与Ashish Singh在DB上转换为bigint并在代码端使用Int64后返回c相同。 在c/VB中转换为long/Int64/UInt64会得到错误的结果。即使在由于小端问题而反转数组之后也是如此

请注意,在DB端,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
这是一条单行线:

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"

请注意有。

请参阅另一个答案-SqlBinary.Value的尾数相反,因此您很可能希望反转字节。请注意,bigint是64位有符号整数,而rowversion是64位无符号整数。给定足够大的rowversion值,强制转换为bigint将产生意外的结果。
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"