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

Posted

技术标签:

【中文标题】如何使用 C# 从 sql server 读取时间戳类型的数据?【英文标题】:How to read timestamp type's data from sql server using C#? 【发布时间】:2011-12-24 04:54:56 【问题描述】:

我在 .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" 的值?

【问题讨论】:

【参考方案1】:

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

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

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

另外,我认为转换为 UInt64 会更好。

【讨论】:

【参考方案2】:

如果您只想将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 format specifier,例如:

Console.WriteLine("Value is 0x0:X.", value);

【讨论】:

查看其他答案 - SqlBinary.Value 具有相反的字节序,因此您很可能希望反转字节。【参考方案3】:

这是一个单行:

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"

请注意有other options that perform better。

【讨论】:

【参考方案4】:

您可以使用以下查询,该查询将返回 bigint 而不是返回 hex。

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

【讨论】:

请注意 bigint 是一个 64 位 有符号 整数,而 rowversion 是一个 64 位 无符号 整数。给定足够大的 rowversion 值,强制转换为 bigint 会产生意想不到的结果。【参考方案5】:

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

注意DB端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

【讨论】:

以上是关于如何使用 C# 从 sql server 读取时间戳类型的数据?的主要内容,如果未能解决你的问题,请参考以下文章

从 C# 检索 SQL Server 扩展属性

使用 C# 和存储过程从 SQL Server 检索 VarChar(MAX)

用于使用 Azure SQL Server 数据的 C# Web API

如何从 C# 代码将 SQL Server CE 迁移到 SQL Server 2012 Express

C#利用SqlDataReader读取SQL Server数据表

如何使用 C# 将数据表从 SQL Server 转换为 Excel [重复]