将sqlserverrowversion转换为long或ulong?rowversion(timestamp)数据类型的正确类型是什么?我知道它是8个字节,但我无法在MSDN中找到一个链接来说明它是有符号长还是无符号长。我应该使用哪个代码,它重要吗?byte[]SqlTimeStamp;longlong转换;longConversion=BitConverter.ToInt64(SqlTimeStamp,0);TimeStamp=BitConverter.GetBytes(longConversion);ulongulong转换;ulongConversion=BitConverter.ToUInt64(SqlTimeStamp,0);TimeStamp=BitConverter.longConversions(;简短回答:没关系,但我会选择UInt64。详细信息:它在语义上等同于binary(8)因此,严格来说,它既不是UInt64也不是Int64,而只是一大块字节(并且应该以这种方式对其进行管理)。也就是说我选择了UInt64因为它是一个递增的数字来保存行版本然后(从逻辑的角度来看)0xFFFFFFFFFFFFFFFF应该大于0而Int64不是这种情况(因为设置为1的64位给出-1并且它小于0)。编辑:请注意,出于仅在内部SQLServer设计人员圈子中已知的原因,ROWVERSION是大端(而显然-bigint不是),那么你需要反转字节首先,请参阅此答案以获得良好的完成。这非常重要。您希望您的比较与SQLServer的比较具有相同的结果。SQLServer对二进制类型使用无符号比较:选择大小写,当0x0FFFFFFFFFFFFFFFF如果您对有符号执行相同的操作长整型,0xFFFFFFFFFFFFFFFF表示-1。那意味着你的比较是不正确的;它与在SQLServer中进行的相同比较不匹配。你肯定想要的是使用ulong,其中0xFFFFFFFFFFFFFFFF是ulong.MaxValue。Endianness也很重要此外,正如Mark指出的那样,BitConverter.GetUInt64无法正确转换。Mark不太正确-BitConverter要么是大端,要么是小端,这取决于它运行的系统。你可以自己看看。此外,即使BitConverter始终是小端字节序,Array.Reverse在堆分配和逐字节复制方面的性能较低。BitConverter无论是在语义上还是在实践上都不是正确的工具。这就是你想要的:staticulongBigEndianToUInt64(byte[]bigEndianBinary){return((ulong)bigEndianBinary[0]Cleanestsolution这是我使用的解决方案:Timestamp.cs。基本上一旦你投射到Timestamp,你就不会得到一个错误。如果在x86系列CPU上运行,由于字节序,两者都无法正常比较时间戳/行版本值。时间戳的第一个字节是最重要的,但对于小字节序,整数类型则不然。在调用BitConverter.ToUInt64(ts)之前调用Array.Reverse(ts),在调用BitConverter.GetBytes(tsUInt64)之后的另一个方向我用这个:以上是C#学习教程:Convertsqlserverrowversiontolongorulong?如果分享的内容对你有用,需要进一步了解C#学习教程,希望你多多关注---(行版本);}返回BitConverter.ToUInt64(rowVersion,0);}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
