37 c# datatable types nullable
我有一个DataTable,它有许多列.其中一些列可以为空.
DataTable dt; // Value set.
DataRow dr; // Value set.
// dr["A"] is populated from T-SQL column defined as: int NULL
Run Code Online (Sandbox Code Playgroud)
那么,什么是从DataRow中的值转换为可空变量的最干净形式.
理想情况下,我可以做类似的事情:
int? a = dr["A"] as int?;
Run Code Online (Sandbox Code Playgroud)
编辑:原来你可以这样做,副作用是如果你的Schema类型没有整数,那么这总是会返回null.Ruben使用的答案dr.Field<int?>("A")确保类型不匹配不会无声地失败.当然,这将通过彻底的单元测试来获得.
相反,我通常会输入以下内容:
int? a = dr["A"] != DBNull.Value ? (int)dr["A"] : 0;
Run Code Online (Sandbox Code Playgroud)
这是一堆更多的击键,但更重要的是,有更多的空间让某人用错误的击键来填充内容.是的,单元测试会选择它,但我宁愿完全停止它.
对于这种情况,什么是最干净,最不容易出错的模式.
Rub*_*ink 55
LINQ in Action的LINQ to DataSets章节是一个很好的阅读.
您将看到的一件事是Field<T>扩展方法,其使用方法如下: -
int? x = dr.Field<int?>( "Field" );
Run Code Online (Sandbox Code Playgroud)
要么
int y = dr.Field<int?>( "Field" ) ?? 0;
Run Code Online (Sandbox Code Playgroud)
要么
var z = dr.Field<int?>( "Field" );
Run Code Online (Sandbox Code Playgroud)
Rob*_*ney 12
这是DataRowExtensions.NET 3.5中类的目的,它提供静态Field<T>和SetField<T>方法,用于在DataRow.NET类型和.NET类型之间往返可空(和非可空)数据.
int? fld = row.Field<int?>("ColumnA")
Run Code Online (Sandbox Code Playgroud)
如果包含一个整数,它将设置fld为nullif row["ColumnA"]包含DBNull.Value其值,如果包含任何其他内容则抛出异常.在回来的路上,
row.SetField("ColumnA", fld);
Run Code Online (Sandbox Code Playgroud)
反过来做同样的事情:如果fld包含null,它设置row["ColumnA"]为DBNull.Value,并以其他方式将其设置为值fld.
还有的过载Field,并SetField为所有的值类型的DataRow支持(包括非可空类型),这样您就可以使用相同的机制来获取和设置无关的领域的数据类型.