我们如何解决所有这些“从类型DBNull转换为类型字符串无效”nastiness?

时间:2009-11-13 10:43:01

标签: winforms ado.net dataset strongly-typed-dataset

在我们的应用程序中,我想不出很多我们关心空字符串字段的情况。我们只是希望它们在大多数情况下显示为空字符串。

因此,当使用内置的ADO.NET数据集/数据表时,错误:

  

从类型DBNull转换为类型   字符串无效

在引用任何旧的字符串数据时,

在应用程序中稍后会很常见。

这是一个特别的问题,因为它可以很容易地把我们赶出去(而且通常在测试中看不到)

我知道有各种解决方案:

1。在所有情况下检查.IsXXXNull

但是:

  • 这是一个繁琐的额外几行 整个应用程序的代码

  • 如果我们忘了支票,即使是100分中的一次,我们也有 <潜在的潜在错误

2。在数据集设计器中,将字段的NullValue属性从默认的“Throw Exception”更改为“Empty”

可是:

  • 我们必须识别和改变 每个表和每个字符串字段 我们添加到数据集设计器 (记住默认是“扔 异常“)

  • 如果我们在100中忘记了一次更改,我们就有一个潜在的错误 潜伏

第3。避免在基础数据中存储Null

可是:

  • 我们必须识别和改变 每个表和每个字符串字段 我们添加到数据库

  • 我们并不总是那样 控制基础数据

4。不要使用数据集设计器,将数据拉入我们自己的类对象,在我们自己的代码中处理所有DBNull混乱

但是:

  • 是的,我们这样做是为了我们的“专业” 表。但数据集设计师是一个 很好,快速的方式来选择一个选项列表 或查找表,我们只是真的 需要默认数据行为

5。使用代码生成器或框架,如CSLA而不是DataSet

但是:

  • 解决一个小问题的重要一步......对SO标记的CSLA提出的排名最高的问题的第二个答案提到:“它的缺点在于它有一点学习曲线。”

2 个答案:

答案 0 :(得分:2)

这就是DataSet和DataTables的原因:

  1. ,用于快速整理使用简单数据访问的应用程序(如您所述)。

  2. 对于设计良好的企业应用程序,
  3. 不太好 - 有太多的简化和概括。

  4. 我发现使用正确的数据绑定感知对象模型几乎总是胜过使用DataSet和DataTables,并且他们可以拥有所有(以及更多!)功能,易用性和使用DataSet和DataTables的速度

    并且您不会遇到类似这样的问题,因为您的业务模型与您的数据库结构没有紧密耦合。

    我还没有遇到过使用像CSLA.NET这样的框架的人,想要回到DataSet和DataTables。

答案 1 :(得分:0)

<强> 5。 (或者可能是4b)

使用在数据访问类中为您提供NULL功能的框架。上述CSLA.NET框架(由Riko提供)使用SafeDataReader类,其工作方式与DataReader完全相同,但可以将所有NULL转换为数据访问和业务逻辑层的空值。