我刚开始用C# 有些东西不是很清楚,在做一个系统时,经常有3个选择项的记录。我就把数据库的这一个字段设成BIT类型了。BIT可以存放0,1是两种情况,我看到BIT类型可以存放NULL值,我就顺便让他可以为NULL来做为第三种值。这样一个BIT就可以存放三个选项。NULL 0 1但是在使用时我发现麻烦大了,所有的类型都是不能赋NULL值的,像int,bool如果我把一个字段里的记录取出赋给一个BOOL类型的变量。经过转换成BOOL类型,我发现NULL值被转换成了0。像这种情况我应该怎么办好呢??是把数据库全改成tinyint呢??还是自定义一种类型呢???
数据库我都写了一大半了。
数据库我都写了一大半了。
解决方案 »
- asp.net+mvc在vs2010调试的问题
- web引用出现问题
- 关于asp留言板
- 错误 1 在应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的节是错误的。
- 关于把dataset中一个表的数据插入到表中,以下代码为什么没有效果?
- aspx2.0与css的问题
- WEB程序用框架有什么好处!欢迎讨论!
- 请问如何在vs.net中看到自定义的命名空间清单?(非系统原有的如System)
- 如何在服务器端操作EXCEL表
- 请高手看下DataList分页代码(急急)
- PagedDataSource的数据源必须是 DataView吗??
- 大家看一下这个问题。谢谢
就算你改字段类型为tinyint,字段对应的字段也不能是BOOL,因为BOOL就只有TRUE和FALSE2种可能,你得用int对应;
或者不改数据库,用string类型对应,1对应“1”,2对应“2”,NULL对应“”
不要用NULL,用"";
如果你赋值到界面的控件比若checked那么他永远就只有true,false.
另外2005支持 bool ? bflag
此时就可以给bflag=null,这个是程序里面写的.具体看你具体表示什么了.
综述:
a.属性就只有true false 那么就使用bit型
b.其他类型可以采用自定义类型,或者tinyint类型.
int? a=null;
bool? b=null;这样当把a,b存到数据库的时候,可以判断当为null的时候,用DBNull.Value来存就可以了,或从数据库中取出的值为DBNull.Value的时候,可以用null给a,b,因为用了"?"后的类型是可空的.
select case when 字段 is null then -1 else cast(字段as int) end2.程序中转换if(row["字段"] == DBNull.value)
{
///
}else
{
///
}
觉得你应该修改数据库好一点
这样以后扩展会有利一点
用布尔值是合适的,空值也会有的.
就像数据库SqlServer一样,可以给字段一个Bit类型(对应C#的bool)是可以为空的,如果不符合规范,那么就不会为可空了.
(个人认为,不好意思)
怎么可能会有三个值呢?
如果真的是用BOOL存储三种类型不符合设计的标准,那我会全改成TinyInt,虽然很麻烦。我这只工作以外的时间给自己写的东西,只想设计的好点,我当时只是想到有一个全局设置,有很多 是和否采用的是BOOL型。但在分类里单独设置时,如果有的分类需要单独设置,继续使用是和否,那全局设置就完全没有意义,因为在分类设置里全部要重新单独设置。于是我就添加了第三种状态----采用全局设置。因为全局设置为BOOL型,所以分类里也用的是BOOL,只不过多了一个允许空。不知道我这种想法有没有错误。
----------------------------------------------------------------------------------分类设置的时候判断是否采用全局设置完全可以另外加一个子段,干嘛非要吊在一个字段上来判断?
{
if( dr["字段"] ==null)
{
return 1
}else return 1.....
}那为什么在数据库中又不用int非要转换一下呢.在写设计文档的时候,其他人在看设计文档的时候,思路也会要来个大转弯.
一个表里有N个三值,难道要加N个字段,那样设计准定不好。
我查了C# 2.0的一些资料,在C# 2.0提供了可空的数据库型。
提供可空的bool型是一种解决方法。
bool? a=null;
而且标准的SQL里 Bit型确实是三值逻辑,
但C#里的三值逻辑上面说和那不太一样,
但C# 2。0确实也提供了对应SQL的可空型BOOL 24.3.8 bool? 类型
可空布尔类型 bool? 可表示三个值 true、false 和 null,概念上类似于 SQL 中的布尔表达式的三值类型。为了确保针对 bool? 操作数的 & 和 | 运算符产生的结果与 SQL 的三值逻辑一致,提供了下列预定义运算符:bool? operator &(bool? x, bool? y);bool? operator |(bool? x, bool? y);下表列出了这些运算符对 true、false 和 null 值的所有组合所产生的结果。可空类型表示可能未知的值。可空类型支持其基础类型的所有值以及一个附加的空状态。任何值类型均可作为可空类型的基础类型。可空类型支持与其基础类型相同的转换和运算符,另外还提供类似于 SQL 的空值传播。在与数据库交互时,支持所有类型(包括值类型)的可空值是很重要的,而一直以来通用编程语言很少或没有提供这方面的支持。在没有直接语言支持的情况下,虽然也存在许多用于处理空值和值类型的方法,但都存在缺点。例如,一种方法是使用“特殊”值(例如将 −1 用于整数)指示空值,但是这种方法只有在能够确定未使用的值的情况下有效。另一种方法是在单独的字段或变量中维护布尔空值指示符,但是这种方法不是很适合参数和返回值。第三种方法是使用一组用户定义的可空类型,但是这仅适用于属于闭集的类型集合。C# 的可空类型 (nullable type) 通过为所有值类型的可空形式提供完整和集成的支持,解决了这个由来已久的问题。可空类型是使用 ? 类型修饰符来构造的。例如,int? 是预定义类型 int 的可空形式。可空类型的基础类型必须是非可空的值类型。可空类型是一个组合了基础类型的值和布尔空值指示符的结构。可空类型的实例具有两个公共只读属性:bool 类型的 HasValue 和可空类型的基础类型的 Value。HasValue 对所有非空实例都为 true,对空实例为 false。当 HasValue 为 true 时,Value 属性返回所包含的值。当 HasValue 为 false 时,尝试访问 Value 属性将引发异常。这是C# 2。0规范里所说的,我不知道对不对应我这种情况,但我觉着应该没问题。
------------
作为C#的一个对象的一个bool 类型的变量,
怎么可能会有三个值呢?
-----------------
对,是对bool不可能有三个值,但是声明成可空的就是三个值了:
bool? 的变量可以有三个值 true,false,null
没事别乱把null用作业务逻辑中的某个状态.原因主要是两方面的, 第一,关于业务的数据格式化便于管理.第二,数据库查询性能.