DataSet中的Nullable Int列

时间:2009-05-18 18:22:34

标签: .net int nullable strongly-typed-dataset

我正在使用.NET强类型数据集,并且有一个带有可为空的int列的表(以及一个可以为空的DateTime列)。

显然,数据集设计器存在一个错误,该错误会阻止这些数据类型上存在可为空的列。设计者只允许“抛出异常”作为空值的默认行为。遗憾的是,在数据库中使用可空数据类型时,空值是合法值,但在尝试从数据行检索此值时会导致抛出异常。

我已经看过几个关于这个问题的新闻组帖子,但还没有看到这个问题的任何体面的解决方法。

我很想知道别人如何处理这个问题。

感谢。

3 个答案:

答案 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>