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

时间:2011-10-10 13:01:06

标签: c# sql

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

我的问题是:

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

2 个答案:

答案 0 :(得分: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;

结构比较的一个好处是它们会自动处理NULL s

关于BitConverter的使用。如果使用BitConverter将上述字节数组转换为UInt64,则最终会得到非常高的数字并且比较没有意义(因为rowversion更改为1,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);

答案 1 :(得分:1)

rowversionbinary(8),如果您使用byte[] / SqlCommand,则会以SqlDataReader的形式返回。如果您使用EF 4.1,相应的属性也将是byte[]

您可以使用BitConverter转换为UInt64,然后进行比较。您还可以从SQL Server返回行转换为bigint,这在C#中显示为long。在任何一种情况下,较大的值都会在以后创建。

在我自己的测试中,我已经看到rowversion从一个小的正值开始(不是0)。如果您投射到bigint,则必须考虑到达2^64时会发生什么。就我而言,这不是我必须担心的事情。如果您认为这将在您的数据库中发生,那么您将不得不添加逻辑来处理您的比较,或者只是坚持使用BitConverter.ToUInt64

另外,请注意rowversion列是否接受NULL;如果有的话,你必须考虑到这一点。