我正在使用 .NET 强类型数据集,并且有一个带有可为空的 int 列(以及可为空的 DateTime 列)的表。
显然,数据集设计器存在一个错误,该错误会阻止在这些数据类型上具有可为空的列。设计器只允许“抛出异常”作为空值的默认行为。不幸的是,在数据库中使用可为空的数据类型时,空值是合法值,但在尝试从数据行中检索此值时会引发异常。
我已经看过几个关于这个问题的新闻组帖子,但还没有看到任何体面的解决这个问题的方法。
我很想听听其他人是如何处理这个问题的。
谢谢。
我正在使用 .NET 强类型数据集,并且有一个带有可为空的 int 列(以及可为空的 DateTime 列)的表。
显然,数据集设计器存在一个错误,该错误会阻止在这些数据类型上具有可为空的列。设计器只允许“抛出异常”作为空值的默认行为。不幸的是,在数据库中使用可为空的数据类型时,空值是合法值,但在尝试从数据行中检索此值时会引发异常。
我已经看过几个关于这个问题的新闻组帖子,但还没有看到任何体面的解决这个问题的方法。
我很想听听其他人是如何处理这个问题的。
谢谢。
我认为 ASP.NET 论坛上的这篇文章将对以下问题有所帮助: Strongly-Typed DataSet/Nullable column issue
将此类属性设置为 null 的唯一方法是使用数据集生成器也创建的辅助方法。这些方法以您的列名命名,因此在您的情况下,您应该在数据行对象上有名为 IsApprovingUserNull() 和 SetApprovingUserNull() 的方法。
DBNull 基本上是用来处理不可为空的值类型,在 .NET 2.0 之前。由于 ADO.NET 的设计,您无法避免 DBNull,除非您选择更直接的方法。DBNull 是 ADO.NET 的内置核心,因此如果您想继续使用它,就必须学会接受它。
如果您提供自己的数据传输对象而不是依赖通用 System.Data 命名空间,则可以检查(在使用数据读取器读取结果时)该值是否为空,但您需要某种方法来生成强类型对象和映射,因为那是非常乏味的工作。
据我所知,DBNull 内置于 ADO.NET 的设计中,如果使用它,构建应用程序的最佳方法是将 DBNull 和 null 合并(规范化)。基本上,提供您自己的 DbConvert 类,该类拦截 DBNull 并在值为 DBNull 时返回实际的空引用。这是最低要求,但一旦完成,您将不必担心浮动的 DBNull 值。
自从我使用类型化 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>