DBNull與Null的區別

2021-05-27 08:42:47 字數 1988 閱讀 6110

null是.net中無效的物件引用。

dbnull是乙個類。dbnull.value是它唯一的例項。它指資料庫中資料為空()時,在.net中的值。

null表示乙個物件的指向無效,即該物件為空物件。

dbnull.value表示乙個物件在資料庫中的值為空,或者說未初始化,dbnull.value物件是指向有效的物件。

dbnull在dotnet是單獨的乙個型別 system.dbnull 。它只有乙個值 dbnull.value 。dbnull 直接繼承 object ,所以 dbnull 不是 string , 不是 int , 也不是 datetime 。。。

但是為什麼 dbnull 可以表示資料庫中的字串,數字,或日期呢?原因是dotnet儲存這些資料的類(datarow等)都是以 object 的形式來儲存資料的。

對於 datarow , 它的 row[column] 返回的值永遠不為 null , 要麼就是具體的為column 的型別的值 。要麼就是 dbnull 。 所以 row[column].tostring() 這個寫法永遠不會在tostring那裡發生nullreferenceexception,但有可能拋下標越界的異常。

dbnull 實現了 iconvertible 。 但是,除了 tostring 是正常的外,其他的to***都會丟擲不能轉換的錯誤。

在 idbcommand(oledbcommand,sqlcommand...) 的executescalar的返回值中,情況可以這樣分析:

select 1 這樣返回的object是 1

select null 這樣返回的是dbnull.value

select isnull(null,1) 返回的是 1

select top 0 id from table1 這樣返回的值是null

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

這裡 executescalar 的規則就是,返回第一列,第一行的資料。如果一行都沒有,那麼executescalar就返回null。如果有第一行,但是第一列為空,那麼返回的是 dbnull 。如果第一列第一行不為空,那麼executescalar就直接對應的dotnet的值。

規則就是這樣的。這裡容易犯的乙個錯誤是,把executescalar返回dbnull與null的情況混淆,例如:

string username=cmd.executescalar().tostring();

除非你認為cmd執行後,肯定至少有一行資料,否則這裡就會出錯。

又或者 select id from usertable where username=@name 這樣的sql語句,如果找不到記錄,那麼executescalar則會返回null,所以千萬不要

int userid=convert.toint32(cmd.executescalar());

或者你會這樣寫 sql 語句:select isnull(id,0) from usertable where username=@name

但是 int userid=convert.toint32(cmd.executescalar()); 依然會出錯,因為上面的語句不成立時,仍然是不返回任何行。

對於idbdataparameter(oleddbparameter,sqlparameter..)的value,如果為null,則代表該引數沒有指定,或者是代表default。如果為dbnull.value,則代表sql中的null

所以,如果你要呼叫儲存過程,裡面有預設引數 @val nvarchar(20)="aabb" ,

那麼cmd.parameters["@val"].value=null 代表使用這個預設的 "aabb"

而cmd.parameters["@val"].value=dbnull.value 代表使用null來傳給 @val

你可以用convert.isdbnull來判斷乙個值是否dbnull。注意convert.isdbnull(null)是false,也就是說null跟dbnull.value是不等的。

NULL和DBNULL的值的區別

c 中,null 關鍵字是表示不引用任何物件的空引用的文字值。null 是引用型別變數的預設值。那麼也只有引用型的變數可以為 null 如果int i null,的話,是不可以的,因為 int是值型別的。在 c 裡面定義字串的時候還可以用 和 string.empty.這兩個都是表示空字串,其中有乙...

C 中DBNull和NULL區別

1 dbnull是乙個類。dbnull.value是它唯一的例項。它指資料庫中資料為空 時,在.net中的值。null表示乙個物件的指向無效,即該物件為空物件。對資料庫中的資料進行判斷時,用if sdrct 0 is dbnull 而不是用!代替is。null 是c 中的null,dbnull是資料...

null 與 的區別

string str1 null str引用為空 string str2 str應用乙個空串 也就是null沒有分配空間,分配了空間,因此str1還不是乙個例項化的物件,而str2已經例項化。注意因為null不是物件,是物件。所以比較的時候必須是 if str1 null 和if str2.equa...