【问题标题】:Cast rowversion to bigint将 rowversion 转换为 bigint
【发布时间】:2014-06-04 13:49:11
【问题描述】:

在我的 C# 程序中,我不想使用字节数组,因此我将 rowversion 数据类型转换为 bigint:

SELECT CAST([version] AS BIGINT) FROM [dbo].[mytable]

所以我收到一个数字而不是字节数组。这种转换是否总是成功的,是否存在任何可能的问题?如果是这样,我应该在哪种数据类型中转换 rowversion?

【问题讨论】:

  • 仅供参考:微软数据转换图表不提供有关此转换的任何信息:link
  • ROWVERSION 和 TIMESTAMP 是同义词,因此微软数据转换图表允许从 ROWVERSION 到 BIGINT 的隐式转换,反之亦然。

标签: sql-server


【解决方案1】:

rowversionbigint 都占用 8 个字节,因此可以进行强制转换。但是,区别在于 bigint 是有符号整数,而 rowversion 不是。

这是 rowversion 的最大值,它将正确转换为最大正 bigint 数 (9223372036854775807):

select cast(0x7FFFFFFFFFFFFFFF as bigint)

但是从这里开始,你会得到负数:

select cast(0x8000000000000000 as bigint)

我没有检查后一种转换是否在 C# 中引发错误。

您的表中可能不会超过 9223372036854775807 行,但这仍然是您应该知道的事情,我个人不建议这样做,除非您确定在您的解决方案中永远不会出现此问题。

【讨论】:

    【解决方案2】:

    您也可以在 C# 中进行转换,但如果您想比较它们,您应该知道 rowversion 显然是存储大端的,所以您需要执行以下操作:

    byte[] timestampByteArray = ... // from datareader/linq2sql etc...
    var timestampInt = BitConverter.ToInt64(timestampByteArray, 0);
    timestampInt = IPAddress.NetworkToHostOrder(timestampInt);
    

    将其转换为 ToUInt64 可能更正确,但是您必须编写自己的字节序转换,因为 NetworkToHostOrder 上没有采用 uint64 的重载。 Or just borrow one 来自 Jon Skeet(搜索“endian”页面)。

    【讨论】:

      猜你喜欢
      • 2021-05-22
      • 1970-01-01
      • 1970-01-01
      • 2021-06-23
      • 2012-04-11
      • 2012-07-20
      • 2019-12-13
      • 2016-01-01
      • 2023-03-11
      相关资源
      最近更新 更多