如何从 SQLDataReader 读取 Rowversion 或时间戳 SQL 服务器数据类型到 C# 变量
How Do I Read A Rowversion or Timestamp SQL Server Data Type From a SQLDataReader to a C# Variable
我有一个 SQL Server 2012 数据库。每个 table 都有一组审计字段。一个是名为 RowVer 的列,数据类型为 timestamp
(与 rowversion
相同)。
我很难将 SqlDataReader
中的值读入具有 属性 且名为 User.RowVersion
且数据类型为 Byte[]
.[=18 的 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 实现。
如果您使用的是 .NET 4.5 或更新版本,您可以
user.RowVersion = rdr.GetFieldValue<byte[]>(18);
如果您使用的是 4.0 或更早版本,则需要执行转换。
user.RowVersion = rdr.GetValue(18) as byte[];
一个选项是使用 CONVERT() 函数在 SQL 级别处理此问题,它很好地映射到 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);
我有一个 SQL Server 2012 数据库。每个 table 都有一组审计字段。一个是名为 RowVer 的列,数据类型为 timestamp
(与 rowversion
相同)。
我很难将 SqlDataReader
中的值读入具有 属性 且名为 User.RowVersion
且数据类型为 Byte[]
.[=18 的 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 实现。
如果您使用的是 .NET 4.5 或更新版本,您可以
user.RowVersion = rdr.GetFieldValue<byte[]>(18);
如果您使用的是 4.0 或更早版本,则需要执行转换。
user.RowVersion = rdr.GetValue(18) as byte[];
一个选项是使用 CONVERT() 函数在 SQL 级别处理此问题,它很好地映射到 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);