将rowversion转换为bigint

时间:2014-06-04 13:49:12

标签: sql-server

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

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

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

2 个答案:

答案 0 :(得分:5)

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

这是rowversion的最大值,可以正确地转换为最大正bigint数字(9223372036854775807):

select cast(0x7FFFFFFFFFFFFFFF as bigint)

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

select cast(0x8000000000000000 as bigint)

我没有检查后者是否在C#中抛出错误。

您的表中可能不会超过9223372036854775807行,但仍然是您应该了解的内容,除非您确定在您的解决方案中永远不会出现此问题,否则我个人不建议这样做。 / p>

答案 1 :(得分:3)

您也可以使用C#进行转换,但是如果您想比较它们,您应该知道rowversion显然存储了big-endian,因此您需要执行以下操作:

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

将它转换为ToUInt64可能更为正确,但是您必须编写自己的endian转换,因为在NetworkToHostOrder上没有超载,需要使用uint64。来自Jon Skeet的Or just borrow one(' endian'的搜索页面)。