我正在使用.NET强类型数据集,并且有一个带有可为空的int列的表(以及一个可以为空的DateTime列)。
显然,数据集设计器存在一个错误,该错误会阻止这些数据类型上存在可为空的列。设计者只允许“抛出异常”作为空值的默认行为。遗憾的是,在数据库中使用可空数据类型时,空值是合法值,但在尝试从数据行检索此值时会导致抛出异常。
我已经看过几个关于这个问题的新闻组帖子,但还没有看到这个问题的任何体面的解决方法。
我很想知道别人如何处理这个问题。
感谢。
答案 0 :(得分:8)
我认为ASP.NET论坛上的这篇文章对这个问题会有一些帮助: Strongly-Typed DataSet/Nullable column issue
将此类属性设置为的唯一方法 null是使用辅助方法 数据集生成器也会创建。 这些方法以你的名字命名 列名,所以在你的情况下,你 应该在数据行上有方法 名为IsApprovingUserNull()的对象 和SetApprovingUserNull()。
答案 1 :(得分:2)
DBNull基本上是用来处理非可空值的类型,在.NET 2.0之前。由于ADO.NET的设计,除非你选择更直接的方法,否则你无法避免DBNull。 DBNull是ADO.NET的核心内容,因此如果您想继续使用它,您必须学会使用它。
如果您提供自己的数据传输对象而不是依赖于通用的System.Data命名空间,则可以检查(在使用数据读取器读取结果时)如果值为null,但您需要某种方式来生成强类型对象和映射,因为这是非常繁琐的工作。
据我所知,DBNull内置于ADO.NET的设计中,如果您使用它,构建应用程序的最佳方法是合并(规范化)DBNull和null。基本上,提供您自己的DbConvert类,它拦截DBNull并返回一个实际的空引用(如果值为DBNull)。这是一个最低要求,但是一旦完成,你就会有更少的DBNull值浮出水来担心。
答案 2 :(得分:0)
我使用了类型化的DataSet已经有一段时间了,但我在旧代码中看到使用codegen:nullValue
属性。我不认为它得到了设计师的支持,至少在VS2005(我用于该项目)中没有,所以你必须在xml编辑器中打开你的xsd文件并手工完成。
生成的xml看起来像这样:
<xs:sequence>
<xs:element
name="MyIntColumn"
codegen:nullValue="0"
type="xs:int"
minOccurs="0" />
<xs:element
name="MyBoolColumn"
codegen:nullValue="false"
type="xs:boolean"
minOccurs="0" />
<xs:element
name="MyDateColumn"
codegen:nullValue="1900-01-01"
type="xs:dateTime"
minOccurs="0" />
</xs:sequence>