DBNULL和NULL
DBNULL 是一个表示空值的类型。该类用于指示不存在的某个已知值(通常用于数据库应用程序中)。
在SqlServer数据库中,表中列字段值是可以为NULL的,为NULL字段值值是一些未初始化的值。这些值对应程序中就为DBNULL。
DBNULL可区分空值(空对象)和未初始化值。
例如:表tab1
id |
name |
1 |
null |
(1) Selectname from tab1 where id = 1
以上sql 查询的name 为null 就是一个未初始化的值,sqlcmd.ExecuteScalar()就会返回DBNULL
(2)Select name from tab1 where id= 2
sql 查询的就是一个空对象。sqlcmd.ExecuteScalar()就会返回NULL.
DBNull类是一个密封类,继承了ISerializable, IConvertible 接口。除了可以调用 ToString()方法外,其他的类型转化方法都会抛出InvalidCastException类型的异常。
NULL 关键字是表示不引用任何对象的 null 引用的文字值。 null 是引用类型变量的默认值。
值类型是不能null的。但在有些有些情况下,可以回出现一些问题。比如java中时间Date类型是一个引用类型,可以为null值。而在.net中时间类型DateTime 是一个结构类型,(值类型),则不能为null.
如果.net 调用java的webservice时,java传递一个值为null的时间值,.net这边的处理就会出问题。为了解决这个问题,CLR增加了“可空的值类型” System.Nullable<T>。
可空的值类型,即可以对它赋值为Null,也可以赋值为值类型。当为赋值为Null时,Nullable<T>实例的HasValue属性为false. 当为赋值为一个值类型时,HasValue属性为true.
C#中使用问号表示法来声明并初始化可空值类型。如:
int32? X = 5;
int32 y = null;
int32? 等价于Nullable<Int32>
可空值类型可以进行装箱
CLR对可空值类型进行装箱时,会执行一些特殊的代码。
1. 如果Nullable<T>为null,CLR就不会进行装箱操作,直接返回null值。
2. 如果Nullable<T>不为null,CLR会从可空实例中取出值,再对这个值进行装箱。
可空值类型也可以进行拆箱
CLR对一个已装箱的值类型拆箱为一个可空的值类型时,如果已装箱的值类型为Null,可空值类型则直接赋值为Null.
对可空值类型的进行拆箱时,CLR会分配内存,比较特殊。
对Nullable<T>对象上上调用GetType方法时,会返回T类型,而不是Nullable<T>类型。