当前位置:  开发笔记 > 编程语言 > 正文

C#DBNull和可空类型 - 最清晰的转换形式

如何解决《C#DBNull和可空类型-最清晰的转换形式》经验,为你挑选了2个好方法。

我有一个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("A")确保类型不匹配不会无声地失败.当然,这将通过彻底的单元测试来获得.

相反,我通常会输入以下内容:

int? a = dr["A"] != DBNull.Value ? (int)dr["A"] : 0; 

这是一堆更多的击键,但更重要的是,有更多的空间让某人用错误的击键来填充内容.是的,单元测试会选择它,但我宁愿完全停止它.

对于这种情况,什么是最干净,最不容易出错的模式.



1> Ruben Bartel..:

LINQ in Action的LINQ to DataSets章节是一个很好的阅读.

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

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

要么

int y = dr.Field( "Field" ) ?? 0;

要么

var z = dr.Field( "Field" );



2> Robert Rossn..:

这是DataRowExtensions.NET 3.5中类的目的,它提供静态FieldSetField方法,用于在DataRow.NET类型和.NET类型之间往返可空(和非可空)数据.

int? fld = row.Field("ColumnA")

如果包含一个整数,它将设置fldnullif row["ColumnA"]包含DBNull.Value其值,如果包含任何其他内容则抛出异常.在回来的路上,

row.SetField("ColumnA", fld);

反过来做同样的事情:如果fld包含null,它设置row["ColumnA"]DBNull.Value,并以其他方式将其设置为值fld.

还有的过载Field,并SetField为所有的值类型的DataRow支持(包括非可空类型),这样您就可以使用相同的机制来获取和设置无关的领域的数据类型.

推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有