如何在C#中比较/转换SQL rowversion字段数据

Jon*_*nes 9 c# sql

我的学生表中有两条带有行版本字段的记录.我在C#代码中创建该记录的对象作为学生类.

我的问题是:

  1. 哪个C#兼容数据类型是rowversion数据转换?
  2. 如何比较两个记录的rowversion并找出哪个是最新的C#?

Chr*_*ski 13

找到最新rowversion的一种方法是使用 StructuralComparer

var r1 = new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00};
var r2 = new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xFF};

bool r1_is_newer = StructuralComparisons.StructuralComparer.Compare(r1, r2) > 0;
Run Code Online (Sandbox Code Playgroud)

结构比较的好处是它们自动处理NULLs

关于使用BitConverter.如果将上述字节数组转换为UInt64使用BitConverter,则最终会得到非常高的数字并且比较没有意义(因为rowversion改变了一个,uint64转换后的数字改变了大约2 ^ 56)

如果你想在它上面洒一些LINQ以使它变得特别慢,你可以使用它

bool r1_is_newer = 
  Enumerable.Zip(r1, r2, (b1, b2) => new { b1, b2 })
  .SkipWhile(item => item.b1 == item.b2)
  .Take(1).Any(item => item.b1 > item.b2);
Run Code Online (Sandbox Code Playgroud)


Jef*_*ata 3

rowversion是,如果您使用/ ,binary(8)则将返回为 a 。如果您使用 EF 4.1,相应的属性也将为.byte[]SqlCommandSqlDataReaderbyte[]

您可以使用BitConverter进行转换UInt64然后进行比较。您还可以返回 SQL Server 中的 rowversion 强制转换bigint,这在 C# 中显示为 a long。无论哪种情况,更大的价值都会在以后创造。

在我自己的测试中,我发现 rowversion 从一个小的正值(而不是 0)开始。如果您确实强制转换为bigint,则必须考虑当它到达 时会发生什么2^64。就我而言,这不是我需要担心的事情。如果您认为这种情况会在数据库中发生,那么您必须在比较中添加逻辑来处理该问题,或者只坚持使用BitConverter.ToUInt64.

rowversion另外,如果您的专栏接受NULL; ,请小心。如果确实如此,您将必须对此负责。

  • 由于小端字节顺序,使用“BitConverter”是一个坏主意。如果只比较平等就可以了。但是,当检查哪一个是最新的时,您将不会得到正确的结果 (5认同)