DBNULL和NULL

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>类型。

 

     

你可能感兴趣的:(DBNULL和NULL)