我刚开始用C# 有些东西不是很清楚,在做一个系统时,经常有3个选择项的记录。我就把数据库的这一个字段设成BIT类型了。BIT可以存放0,1是两种情况,我看到BIT类型可以存放NULL值,我就顺便让他可以为NULL来做为第三种值。这样一个BIT就可以存放三个选项。NULL 0 1但是在使用时我发现麻烦大了,所有的类型都是不能赋NULL值的,像int,bool如果我把一个字段里的记录取出赋给一个BOOL类型的变量。经过转换成BOOL类型,我发现NULL值被转换成了0。像这种情况我应该怎么办好呢??是把数据库全改成tinyint呢??还是自定义一种类型呢??? 
数据库我都写了一大半了。

解决方案 »

  1.   

    应该可以在读数据库时判断的,如果为null怎么怎么样,case 字段 when null 。。
      

  2.   

    设计问题,你用BOOL类型来对应这个字段就这明这个字段本来就应该只能是2个值,你既然希望这个字段有3种值那么就不应该用BOOL类型来对应
    就算你改字段类型为tinyint,字段对应的字段也不能是BOOL,因为BOOL就只有TRUE和FALSE2种可能,你得用int对应;
    或者不改数据库,用string类型对应,1对应“1”,2对应“2”,NULL对应“”
      

  3.   

    你在代码操作数据库的时候,
    不要用NULL,用"";
      

  4.   

    Null de string 类型对应 “”
      

  5.   

    如果是bool型的话就应该是2总情况,而数据库总null值是"不知道的意思",既然你有3总状态那么建议你用tinyint.-1,0,1.
    如果你赋值到界面的控件比若checked那么他永远就只有true,false.
    另外2005支持 bool ? bflag
    此时就可以给bflag=null,这个是程序里面写的.具体看你具体表示什么了.
    综述:
    a.属性就只有true false 那么就使用bit型
    b.其他类型可以采用自定义类型,或者tinyint类型.
      

  6.   

    没有必要改类型,用bit就可以解决问题了,你所说的int,bool等不能为null值,你可以用可为空的类型就要以了,比如:
    int? a=null;
    bool? b=null;这样当把a,b存到数据库的时候,可以判断当为null的时候,用DBNull.Value来存就可以了,或从数据库中取出的值为DBNull.Value的时候,可以用null给a,b,因为用了"?"后的类型是可空的.
      

  7.   

    2楼的兄弟说的不错  应该判断该值是NULL时怎么办
      

  8.   

    case state when null then ‘待定’ case state when '1' then '启用' case state when '0' then '禁用',我说的是这个意思,说错莫怪。^_^
      

  9.   

    晕,错了。是这样:case state when null then ‘待定’ when '1' then '启用' when '0' then '禁用' end
      

  10.   

    TO hbxtlhx(平民百姓) ( ) 感激不尽。100分奉上~~~我刚才查了一下,C#里确实有这种可空的类型。非常的好。我觉着我的设计没有问题,我的系统的设置是分两级的,为了便于用户设置,如果为NULL我就采用上一级的设置(最上层设置是不能为NULL的)。我觉着这样在更改设置时会非常方便。
      

  11.   

    bool 值本来就应该只有两个值。如果要有三个选项可用 Char(1) 或smallint型。既然用了。只能在取出的时候判断了。1.sql 中转换。 将bit 转换成 int 
    select case when  字段 is null then -1 else cast(字段as int) end2.程序中转换if(row["字段"] == DBNull.value)
    {
     ///
    }else
    {
       ///
    }
      

  12.   

    bit只有0跟1,没有null概念的
    觉得你应该修改数据库好一点
    这样以后扩展会有利一点
      

  13.   

    虽然可以解决问题,但还是强烈建议改类型。拿bit值保存三个类型就不是一个好的设计。
      

  14.   

    可空类型System.Nullable<T>是新的特性,是可以使用的,因为确实有这种要求,改类型也是一个解决的办法.不过我认为没有必要改类型.因为用可空的就可以了.
      

  15.   

    如果真的是用BOOL存储三种类型不符合设计的标准,那我会全改成TinyInt,虽然很麻烦。我这只工作以外的时间给自己写的东西,只想设计的好点,我当时只是想到有一个全局设置,有很多 是和否采用的是BOOL型。但在分类里单独设置时,如果有的分类需要单独设置,继续使用是和否,那全局设置就完全没有意义,因为在分类设置里全部要重新单独设置。于是我就添加了第三种状态----采用全局设置。因为全局设置为BOOL型,所以分类里也用的是BOOL,只不过多了一个允许空。不知道我这种想法有没有错误。
      

  16.   

    我觉得楼主想法没有错,这是设计中经常会有的.
    用布尔值是合适的,空值也会有的.
    就像数据库SqlServer一样,可以给字段一个Bit类型(对应C#的bool)是可以为空的,如果不符合规范,那么就不会为可空了.
    (个人认为,不好意思)
      

  17.   

    对于一个数据库的字段或是可以用NULL的.但是如果把这个数据库的对象和C#对象联系起来.作为C#的一个对象的一个bool 类型的变量,
    怎么可能会有三个值呢?
      

  18.   

    superj(pcgenius) ( ) 信誉:100    Blog  2007-01-10 11:43:22  得分: 0  
     
     
       如果真的是用BOOL存储三种类型不符合设计的标准,那我会全改成TinyInt,虽然很麻烦。我这只工作以外的时间给自己写的东西,只想设计的好点,我当时只是想到有一个全局设置,有很多 是和否采用的是BOOL型。但在分类里单独设置时,如果有的分类需要单独设置,继续使用是和否,那全局设置就完全没有意义,因为在分类设置里全部要重新单独设置。于是我就添加了第三种状态----采用全局设置。因为全局设置为BOOL型,所以分类里也用的是BOOL,只不过多了一个允许空。不知道我这种想法有没有错误。
      ----------------------------------------------------------------------------------分类设置的时候判断是否采用全局设置完全可以另外加一个子段,干嘛非要吊在一个字段上来判断?
     
      

  19.   

    如果你要在C#中生成一个对象,那么就不能用bool类型了.比如:public int type
    {
        if( dr["字段"] ==null) 
        {
          return 1
        }else return 1.....
    }那为什么在数据库中又不用int非要转换一下呢.在写设计文档的时候,其他人在看设计文档的时候,思路也会要来个大转弯.
      

  20.   

    TO make11111(孙少平)
    一个表里有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 的空值传播。在与数据库交互时,支持所有类型(包括值类型)的可空值是很重要的,而一直以来通用编程语言很少或没有提供这方面的支持。在没有直接语言支持的情况下,虽然也存在许多用于处理空值和值类型的方法,但都存在缺点。例如,一种方法是使用“特殊”值(例如将 &#8722;1 用于整数)指示空值,但是这种方法只有在能够确定未使用的值的情况下有效。另一种方法是在单独的字段或变量中维护布尔空值指示符,但是这种方法不是很适合参数和返回值。第三种方法是使用一组用户定义的可空类型,但是这仅适用于属于闭集的类型集合。C# 的可空类型 (nullable type) 通过为所有值类型的可空形式提供完整和集成的支持,解决了这个由来已久的问题。可空类型是使用 ? 类型修饰符来构造的。例如,int? 是预定义类型 int 的可空形式。可空类型的基础类型必须是非可空的值类型。可空类型是一个组合了基础类型的值和布尔空值指示符的结构。可空类型的实例具有两个公共只读属性:bool 类型的 HasValue 和可空类型的基础类型的 Value。HasValue 对所有非空实例都为 true,对空实例为 false。当 HasValue 为 true 时,Value 属性返回所包含的值。当 HasValue 为 false 时,尝试访问 Value 属性将引发异常。这是C# 2。0规范里所说的,我不知道对不对应我这种情况,但我觉着应该没问题。
      

  21.   

    楼主上面的文字说明的情况,我是认为正好和问题相符的.确实.NET在2.0中可以对值类型有可空的设置.
    ------------
    作为C#的一个对象的一个bool 类型的变量,
    怎么可能会有三个值呢?
    -----------------
    对,是对bool不可能有三个值,但是声明成可空的就是三个值了:
    bool? 的变量可以有三个值 true,false,null
      

  22.   

    用 tinyint
    没事别乱把null用作业务逻辑中的某个状态.原因主要是两方面的, 第一,关于业务的数据格式化便于管理.第二,数据库查询性能.
      

  23.   

    改数据库字段,要不在取出数据进判断在NULL时如何处理,用case when就行