如何从SQLDataReader到c#变量中读取Rowversion或Timestamp SQL Server数据类型?

本文关键字:Timestamp Rowversion SQL Server 数据类型 读取 SQLDataReader 变量 | 更新日期: 2023-09-27 18:16:28

我有SQL Server 2012数据库。每个表都有一组审计字段。一个是名为RowVer的列,数据类型为timestamp(与rowversion相同)。

我很难将SqlDataReader的值读取为具有Byte[]数据类型的属性User.RowVersion的c#对象。

while (rdr.Read())块代码片段

...
user.DateCreated = rdr.GetDateTime(14);
user.CreatedByUserId = rdr.GetInt32(15);
if (!rdr.IsDBNull(16)) { user.DateLastUpdated = rdr.GetDateTime(16); }
if (!rdr.IsDBNull(17)) { user.LastUpdatedByUserId = rdr.GetInt32(17); }
user.RowVersion = rdr.???;
...

RowVersion值仅在更新数据库时用作并发性比较。

这当然不是EF的实现

如何从SQLDataReader到c#变量中读取Rowversion或Timestamp SQL Server数据类型?

如果您使用的是。net 4.5或更新版本,您可以使用

user.RowVersion = rdr.GetFieldValue<byte[]>(18);

如果你是4.0或更老版本,你将需要执行强制转换。

user.RowVersion = rdr.GetValue(18) as byte[];

一种选择是在SQL级别使用CONVERT()函数处理这个问题,它可以很好地映射到BIGINT:

CONVERT(BIGINT, MyRowVersionColumn)

现在你可以很容易地把它读入Int64:

user.RowVersion = rdr.GetInt64(18);

当然,这意味着要改变对象的数据类型,但你可能认为这是一件好事。

如果你想保留字节数组,你可以这样做:

rdr.GetBytes(18, 0, user.RowVersion, 0, rdr.GetBytes());

或者,因为字段的长度是已知的:

rdr.GetBytes(18, 0, user.RowVersion, 0, 8);