我有一个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类型没有整数,那么这总是会返回null.Ruben使用的答案dr.Field
确保类型不匹配不会无声地失败.当然,这将通过彻底的单元测试来获得.
相反,我通常会输入以下内容:
int? a = dr["A"] != DBNull.Value ? (int)dr["A"] : 0;
这是一堆更多的击键,但更重要的是,有更多的空间让某人用错误的击键来填充内容.是的,单元测试会选择它,但我宁愿完全停止它.
对于这种情况,什么是最干净,最不容易出错的模式.
LINQ in Action的LINQ to DataSets章节是一个很好的阅读.
您将看到的一件事是Field
扩展方法,其使用方法如下: -
int? x = dr.Field( "Field" );
要么
int y = dr.Field( "Field" ) ?? 0;
要么
var z = dr.Field( "Field" );
这是DataRowExtensions
.NET 3.5中类的目的,它提供静态Field
和SetField
方法,用于在DataRow
.NET类型和.NET类型之间往返可空(和非可空)数据.
int? fld = row.Field("ColumnA")
如果包含一个整数,它将设置fld
为null
if row["ColumnA"]
包含DBNull.Value
其值,如果包含任何其他内容则抛出异常.在回来的路上,
row.SetField("ColumnA", fld);
反过来做同样的事情:如果fld
包含null
,它设置row["ColumnA"]
为DBNull.Value
,并以其他方式将其设置为值fld
.
还有的过载Field
,并SetField
为所有的值类型的DataRow
支持(包括非可空类型),这样您就可以使用相同的机制来获取和设置无关的领域的数据类型.