2023年6月21日发(作者:)

DBNull用法

总结byhubupc

一:判断是否为DBNULL 的几种方式(返回多个值的情况)

static bool IsDBNull(Object value)

如果 value 为 TypeCode..::.DBNull 类型,则为 true;否则为 false。

2 if(Object value is )

如果 value 为 TypeCode..::.DBNull 类型,则为 true;否则为 false。

3

((Object value)

如果 value 为 TypeCode..::.DBNull 类型,则为 true;否则为 false。

注意:

(Object value) 使用Row[“Name”]的形式,不使用的形式,否则失效。

无法将类型为“”的对象强制转换为类型“”。

例如:

TableAdapter ta = new

TableAdapter();

DataTable tb = a();

= "fdsaf";

if (tb[4]["RegionDescription"] is )

// 不使用tb[4].RegionDescription is DBNull的形式

{

("tb[4]["RegionDescription"]");

}

if (ll(tb[4]["RegionDescription"]))

{

("tb[4]["RegionDescription"]");

}

if ((tb[4]["RegionDescription"]))

{

("tb[4]["RegionDescription"]");

}

二:使用须知

row[column] 返回的值永远不为 null , 要么就是具体的为column 的类型的值 。 要么就是 DBNull 。

所以 row[column].ToString() 这个写法永远不会在ToString那里发生NullReferenceException。

DBNull 实现了 IConvertible 。 但是,除了 ToString 是正常的外,其他的ToXXX都会抛出不能转换的错误。

若是返回单个值

If(value==null)即可

TableAdapter regionta=new

TableAdapter();

string desc = Query(5);

if (desc == null)

{

("null");

}

资料:

DBNull 是一个单独的类,这意味着该类只能存在一个实例。这个唯一的实例是

。DBNull 直接继承 Object ,所以 DBNull 不是 string , 不是

int , 也不是 DateTime。。。

但是为什么 DBNull 可以表示数据库中的字符串,数字,或日期呢?原因是DotNet储存这些数据的类(DataRow等)都是以 object 的形式来储存数据的。

对于 DataRow , 它的 row[column] 返回的值永远不为 null , 要么就是具体的为column 的类型的值 。 要么就是 DBNull 。 所以 row[column].ToString()

这个写法永远不会在ToString那里发生NullReferenceException。

如果为,则代表SQL中的NULL

如果你要调用存储过程,里面有参数 @val nvarchar(20)="AABB" ,

那么ters["@val"].Value=null 代表使用这个默认的 "AABB"

而ters["@val"].Value= 代表使用NULL来传给 @val

你可以用ll来判断一个值是否DBNull。注意ll(null)是false。

在数据库应用程序中,空对象是字段的有效值。该类区分空值(空对象)和未初始化值( 实例)。例如,表可以包含具有未初始化字段的记录。默认情况下,这些未初始化字段具有 DBNull .Value。

在C#中,我从DataSet中取值,准确地说应该是从DataRow的一列中取值。

当为DBNull的时候,只需要加判断 if(dr[列索引] is )就可以了

DBNull在DotNet是单独的一个类型 。它只有一个值 。

DBNull直接继承 Object ,所以 DBNull 不是 string , 不是 int , 也不是

DateTime 。。。

但是为什么 DBNull 可以表示数据库中的字符串,数字,或日期呢?原因是DotNet储存这些数据的类(DataRow等)都是以object 的形式来储存数据的。

对于 DataRow , 它的 row[column] 返回的值永远不为 null , 要么就是具体的为column 的类型的值 。

要么就是 DBNull 。 所以 row[column].ToString()

这个写法永远不会在ToString那里发生NullReferenceException。

DBNull 实现了 IConvertible 。 但是,除了 ToString 是正常的外,其他的ToXXX都会抛出不能转换的错误。

在 IDbCommand()

的ExecuteScalar的返回值中,情况可以这样分析:

select 1 这样返回的object是 1

select null 这样返回的是

select isnull(null,1) 返回的是 1 select top 0 id from table1 这样返回的值是null

select isnull(id,0) from table1 where 1=0 返回的值是null

这里 ExecuteScalar的规则就是,返回第一列,第一行的数据。如果第一列第一行不为空,那么ExecuteScalar就直接对应的DotNet的值。如果有第一行,但是第一列为空,那么返回的是DBNull 。如果一行都没有,那么ExecuteScalar就返回null

规则就是这样的。这里容易犯的一个错误是,把ExecuteScalar返回DBNull与null的情况混淆,例如:

string username=eScalar().ToString();

除非你认为cmd执行后,肯定至少有一行数据,否则这里就会出错。

又或者 select id from usertable where username=@name

这样的sql语句,如果找不到记录,那么ExecuteScalar则会返回null,所以千万不要

int userid=32(eScalar());

或者你会这样写 SQL 语句:select isnull(id,0) from usertable where

username=@name

但是 int userid=32(eScalar());

依然会出错,因为上面的语句不成立时,仍然是不返回任何行。

对于IDbDataParameter(OleDDbParameter,SqlParameter..)的Value,如果为null,则代表该参数没有指定,或者是代表DEFAULT。如果为,则代表SQL中的NULL

所以,如果你要调用存储过程,里面有参数 @val nvarchar(20)="AABB" ,

那么ters["@val"].Value=null 代表使用这个默认的 "AABB"

而ters["@val"].Value= 代表使用NULL来传给

@val

你可以用ll来判断一个值是否DBNull。注意ll(null)是false。

备注:以上的SQL语句全是指SQLSERVER2000的。

2023年6月21日发(作者:)

DBNull用法

总结byhubupc

一:判断是否为DBNULL 的几种方式(返回多个值的情况)

static bool IsDBNull(Object value)

如果 value 为 TypeCode..::.DBNull 类型,则为 true;否则为 false。

2 if(Object value is )

如果 value 为 TypeCode..::.DBNull 类型,则为 true;否则为 false。

3

((Object value)

如果 value 为 TypeCode..::.DBNull 类型,则为 true;否则为 false。

注意:

(Object value) 使用Row[“Name”]的形式,不使用的形式,否则失效。

无法将类型为“”的对象强制转换为类型“”。

例如:

TableAdapter ta = new

TableAdapter();

DataTable tb = a();

= "fdsaf";

if (tb[4]["RegionDescription"] is )

// 不使用tb[4].RegionDescription is DBNull的形式

{

("tb[4]["RegionDescription"]");

}

if (ll(tb[4]["RegionDescription"]))

{

("tb[4]["RegionDescription"]");

}

if ((tb[4]["RegionDescription"]))

{

("tb[4]["RegionDescription"]");

}

二:使用须知

row[column] 返回的值永远不为 null , 要么就是具体的为column 的类型的值 。 要么就是 DBNull 。

所以 row[column].ToString() 这个写法永远不会在ToString那里发生NullReferenceException。

DBNull 实现了 IConvertible 。 但是,除了 ToString 是正常的外,其他的ToXXX都会抛出不能转换的错误。

若是返回单个值

If(value==null)即可

TableAdapter regionta=new

TableAdapter();

string desc = Query(5);

if (desc == null)

{

("null");

}

资料:

DBNull 是一个单独的类,这意味着该类只能存在一个实例。这个唯一的实例是

。DBNull 直接继承 Object ,所以 DBNull 不是 string , 不是

int , 也不是 DateTime。。。

但是为什么 DBNull 可以表示数据库中的字符串,数字,或日期呢?原因是DotNet储存这些数据的类(DataRow等)都是以 object 的形式来储存数据的。

对于 DataRow , 它的 row[column] 返回的值永远不为 null , 要么就是具体的为column 的类型的值 。 要么就是 DBNull 。 所以 row[column].ToString()

这个写法永远不会在ToString那里发生NullReferenceException。

如果为,则代表SQL中的NULL

如果你要调用存储过程,里面有参数 @val nvarchar(20)="AABB" ,

那么ters["@val"].Value=null 代表使用这个默认的 "AABB"

而ters["@val"].Value= 代表使用NULL来传给 @val

你可以用ll来判断一个值是否DBNull。注意ll(null)是false。

在数据库应用程序中,空对象是字段的有效值。该类区分空值(空对象)和未初始化值( 实例)。例如,表可以包含具有未初始化字段的记录。默认情况下,这些未初始化字段具有 DBNull .Value。

在C#中,我从DataSet中取值,准确地说应该是从DataRow的一列中取值。

当为DBNull的时候,只需要加判断 if(dr[列索引] is )就可以了

DBNull在DotNet是单独的一个类型 。它只有一个值 。

DBNull直接继承 Object ,所以 DBNull 不是 string , 不是 int , 也不是

DateTime 。。。

但是为什么 DBNull 可以表示数据库中的字符串,数字,或日期呢?原因是DotNet储存这些数据的类(DataRow等)都是以object 的形式来储存数据的。

对于 DataRow , 它的 row[column] 返回的值永远不为 null , 要么就是具体的为column 的类型的值 。

要么就是 DBNull 。 所以 row[column].ToString()

这个写法永远不会在ToString那里发生NullReferenceException。

DBNull 实现了 IConvertible 。 但是,除了 ToString 是正常的外,其他的ToXXX都会抛出不能转换的错误。

在 IDbCommand()

的ExecuteScalar的返回值中,情况可以这样分析:

select 1 这样返回的object是 1

select null 这样返回的是

select isnull(null,1) 返回的是 1 select top 0 id from table1 这样返回的值是null

select isnull(id,0) from table1 where 1=0 返回的值是null

这里 ExecuteScalar的规则就是,返回第一列,第一行的数据。如果第一列第一行不为空,那么ExecuteScalar就直接对应的DotNet的值。如果有第一行,但是第一列为空,那么返回的是DBNull 。如果一行都没有,那么ExecuteScalar就返回null

规则就是这样的。这里容易犯的一个错误是,把ExecuteScalar返回DBNull与null的情况混淆,例如:

string username=eScalar().ToString();

除非你认为cmd执行后,肯定至少有一行数据,否则这里就会出错。

又或者 select id from usertable where username=@name

这样的sql语句,如果找不到记录,那么ExecuteScalar则会返回null,所以千万不要

int userid=32(eScalar());

或者你会这样写 SQL 语句:select isnull(id,0) from usertable where

username=@name

但是 int userid=32(eScalar());

依然会出错,因为上面的语句不成立时,仍然是不返回任何行。

对于IDbDataParameter(OleDDbParameter,SqlParameter..)的Value,如果为null,则代表该参数没有指定,或者是代表DEFAULT。如果为,则代表SQL中的NULL

所以,如果你要调用存储过程,里面有参数 @val nvarchar(20)="AABB" ,

那么ters["@val"].Value=null 代表使用这个默认的 "AABB"

而ters["@val"].Value= 代表使用NULL来传给

@val

你可以用ll来判断一个值是否DBNull。注意ll(null)是false。

备注:以上的SQL语句全是指SQLSERVER2000的。