2

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

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

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

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

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

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

4

2 回答 2

2

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

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

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

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

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

于 2009-02-10T22:38:00.183 回答
1

恕我直言,您不应在位/布尔字段中允许空值。

Mike Hadlow 在这里有一篇很好的文章:

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

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

于 2009-01-14T23:58:43.957 回答