代码之家  ›  专栏  ›  技术社区  ›  Dillie-O

如何在XSD数据集中处理DBNull到布尔值的转换?

  •  2
  • Dillie-O  · 技术社区  · 17 年前

    在我的数据库中,我的一个表中有几列是位(布尔)值。允许它们为NULL,因为字段并不总是包含数据。

    我已经完成了使用该表创建XSD数据集的过程,并确保AllowDBNull字段设置为True。

    但是,当我使用配置的GetData方法将数据库中的下拉记录拉入数据表时,我遇到了以下错误:

    [InvalidCastException: Conversion from type 'DBNull' to type 'Boolean' is not valid.]
    

    我是否需要在列的DefaultValue字段之外指定其他内容,或者是否需要设置其他字段?

    我仍然处于这个项目的开发阶段,所以如果首选将字段更改为char并使用Y/N/NULL选项,我并不反对这样做。

    2 回复  |  直到 17 年前
        1
  •  2
  •   Mark Brady Mark Brady    17 年前

    我不得不不同意伊恩的观点。三值逻辑和二值逻辑一样可行。桌子上的人是活着还是死了,或者你不知道他是活着还是已经死了。如果迈克有他的方式,你不能在这里使用一点。你需要一个FK到状态表,1=活着,2=死亡,3=未知。

    该位的全部目的是节省空间,您始终可以将列设置为CHAR(1),并使用约束将值限制为T或F、Y或N(或U)。

    但我认为伊恩误解了迈克说的话。Mike并不反对使用Nulls,毕竟他认为在流程完成之前,EndDate列应该为null。他只是说不要在列中为空值注入神秘属性。..就像它是知道一个进程是否处于某种状态的关键。

    事实上,数据库中的null具有某些非常有用的副作用。Oracle(可能是其他数据库)不索引空值。所以,如果你有一个只有一个值很重要的列,比如说你有一份永远不会清除的员工列表和一个索引的is_Active_Employment位列。在这种情况下,对于一家成熟的企业,您拥有的员工人数>>>比你现在的员工人数还要多。假设你有1%的1和99%的0。

    该索引比需要的大99倍。它正在索引所有的1,这很好,因为它们是表的1%,但它也为你永远无法使用该索引查找的行加载了0。如果你想要所有不活跃的员工,索引将被忽略,并执行FTS。因此,从数据库的角度来看,1和NULL的效率要高得多。

        2
  •  1
  •   Iain Holder    17 年前

    依我之见,你不应该在bit/boolean字段中允许null。

    Mike Hadlow在这里有一个很好的帖子:

    http://mikehadlow.blogspot.com/2006/10/nullability-voodoo.html

    根据定义,布尔值是一种双态类型。通过使其可以为空,您添加了第三个状态。它会在某个时候回来困扰你。

    推荐文章