数据集中的可空整数列

8
我正在使用.NET强类型数据集,并且有一个可为空的整数列(以及一个可为空的日期时间列)。
显然,数据集设计器存在一个错误,防止这些数据类型具有可空列。设计师仅允许“抛出异常”作为空值的默认行为。不幸的是,当在数据库中使用可空数据类型时,空值是合法值,但在尝试从数据行检索此值时会导致抛出异常。
我看过几个新闻组发布关于这个问题的帖子,但还没有看到任何像样的解决方法。
我很想听听其他人如何处理这个问题。
谢谢。

澄清:数据集使用DBNull(默认值),而不是null。 - goombaloon
3个回答

8
我认为ASP.NET论坛上的这篇文章会对您的问题有所帮助:Strongly-Typed DataSet/Nullable column issue 引用如下:
唯一将此类属性设置为null的方法是使用数据集生成器还创建的帮助程序方法。这些方法以列名称命名,因此在您的情况下,数据行对象上应该有名为IsApprovingUserNull()和SetApprovingUserNull()的方法。

3

DBNull最初是为了处理非可空值类型而引入的,它在.NET 2.0之前就已经存在了。由于ADO.NET的设计,除非您选择更直接的方法,否则无法避免使用DBNull。DBNull内置在ADO.NET核心中,因此如果要继续使用它,则必须学会与其共存。

如果您提供自己的数据传输对象而不是依赖于通用的System.Data命名空间,则可以在使用数据读取器读取结果时检查值是否为空,但是您需要一些方法来生成强类型对象和映射,因为这确实是很繁琐的工作。

据我所知,DBNull已经内置在ADO.NET的设计中,如果您使用它来构建应用程序,则最好将DBNull和null合并(规范化)。基本上,您需要提供自己的DbConvert类,该类拦截DBNull并在值为DBNull时返回实际的null引用。这是一个最小的要求,但是一旦完成,您将不再需要担心太多的DBNull值。


0

我已经有一段时间没用过Typed DataSets,但我在我的旧代码中看到使用了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>

3
不幸的是,这引入了“神奇数字”的概念,如果可能的话我希望避免它。(也就是说,“Null”非常明显是 null,而“0”则不是) - lc.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接