在我的数据库中,我的一个表中有几列是位( bool )值。它们允许为 NULL,因为字段并不总是包含数据。
我已经完成了使用该表创建 XSD 数据集的过程,并确保 AllowDBNull 字段设置为 True。
但是,当我使用配置的 GetData 方法将数据库中的记录拉入数据表时,遇到以下错误:
[InvalidCastException: Conversion from type 'DBNull' to type 'Boolean' is not valid.]
我是否需要在列的 DefaultValue 字段中指定其他内容,或者是否需要设置其他字段?
我这个项目仍处于开发阶段,因此如果首选将字段更改为 char 并使用 Y/N/NULL 选项,我不太反对这样做。
最佳答案
我不同意伊恩的观点。三值逻辑与二值逻辑一样可行。表中的人是活着还是死了,或者你不知道他是活着还是死了。如果迈克有他的办法,你就不能在这里使用一点。您需要一个状态表的 FK,1= 活着,2= 死亡,3= 未知。
该位的全部目的是节省空间,您始终可以将该列设置为 CHAR(1),并使用约束将值限制为 T 或 F、Y 或 N(或 U)。
但我认为伊恩误解了迈克的话。 Mike 并不阻止使用 Null,毕竟他认为 EndDate 列应该为 null,直到该过程完成。他只是说不要在列中注入(inject)具有神秘属性的空值......就像它是了解进程是否处于某种状态的关键一样。
事实上,数据库中的空值具有某些非常有用的副作用。 Oracle(也许其他数据库)不索引空值。因此,如果您有一个列,其中只有一个值很重要 - 例如,您有一个从未清除的员工列表和一个已编制索引的 Is_Active_Employee 位列。在这种情况下,对于一家已建立的企业,您拥有的员工数量>>>比您现在拥有的员工数量。假设您有 1% 的 1 和 99% 的 0。
该索引比实际需要的大 99 倍。它对所有 1 进行索引,这很好,因为它们占表的 1%,但它也为您永远无法使用该索引查找的行加载了 0。如果您想要所有不活跃的员工,则索引将被忽略并执行 FTS。因此,从数据库的角度来看,1 和 NULL 会更有效。
关于.net - 如何在 XSD 数据集中处理 DBNull 到 bool 值的转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/445136/