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

时间:2009-01-14 23:50:12

标签: .net xsd dataset dbnull

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

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

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

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

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

我还处于这个项目的开发阶段,所以如果将字段更改为字符并且使用Y / N / NULL选项是首选,那么我不会太偏向于那样。

2 个答案:

答案 0 :(得分:2)

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

该位的整个目的是节省空间,您可以始终将列设置为带有约束的CHAR(1),将值限制为T或F,Y或N(或U)。

但我认为伊恩误解了迈克所说的话。 Mike并没有阻止使用Nulls,毕竟他认为EndDate列应该为null,直到进程完成。他只是说不要在具有神秘属性的列中填充空值...就像知道进程是否处于某种状态的关键一样。

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

该指数比需要的指数大99倍。它正在索引所有的1,这很好,因为它们是表的1%,但它也加载了0,用于你不能使用该索引查找的行。如果您想要所有非活动员工,则会忽略索引并执行FTS。因此,从数据库的角度看,1和NULL的效率会更高。

答案 1 :(得分:1)

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

Mike Hadlow在这里发表了一篇好文章:

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

布尔定义为双状态类型。通过使其可为空,您将添加第三个状态。它会在某个时候回来困扰你。