我有一个DataTable,其中有许多列。其中一些列是可为空的。

DataTable dt;  // Value set.
DataRow dr;  // Value set.

// dr["A"] is populated from T-SQL column defined as: int NULL

那么,从DataRow中的值转换为可空变量的最干净的形式是什么。

理想情况下,我可以执行以下操作:
int? a = dr["A"] as int?;

编辑:事实证明您可以执行此操作,其副作用是,如果您的Schema类型不是int,则总是返回null。 Ruben使用dr.Field<int?>("A")的答案可确保类型不匹配不会在没有提示的情况下失败。当然,这将通过彻底的单元测试来掌握。

相反,我通常按照以下方式键入内容:
int? a = dr["A"] != DBNull.Value ? (int)dr["A"] : 0;

这是更多的击键,但更重要的是,有人用错误的击键填充东西的空间更大。
是的,单元测试可以解决这个问题,但是我宁愿完全停止它。

在这种情况下,最干净,最不易出错的模式是什么。

最佳答案

The LINQ to DataSets chapter of LINQ in Action是一本好书。

您将看到的一件事是Field<T>扩展方法,其使用方法如下:

int? x = dr.Field<int?>( "Field" );

要么
int y = dr.Field<int?>( "Field" ) ?? 0;

要么
var z = dr.Field<int?>( "Field" );

07-24 18:44