通常你會在什麼地方遇到DBNull

2021-04-09 02:21:28 字數 1919 閱讀 2921

今天不只被外包,還要跑到虹橋機場去幫忙實施。可惜來到這裡又好象沒有什麼事幹。。:) 剛好可以寫寫blog 。

剛好這幾天寫資料庫操作比較多,是時候寫寫關於dbnull的東西了。

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就直接對應的dotnet的值。如果有第一行,但是第一列為空,那麼返回的是 dbnull 。如果一行都沒有,那麼executescalar就返回null

規則就是這樣的。這裡容易犯的乙個錯誤是,把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。

備註:以上的sql語句全是指sqlserver2000的。其他的資料庫是否為同樣的行為,我不確定。 

通常你會在什麼地方遇到DBNull

dbnull在dotnet是單獨的乙個型別 system.dbnull 它只有乙個值 dbnull.value dbnull 直接繼承 object 所以 dbnull 不是 string 不是 int 也不是 datetime 但是為什麼 dbnull 可以表示資料庫中的字串,數字,或日期呢?原因...

如果你很忙,你一定在什麼地方做錯

原文 if you re busy,you re doing something wrong 感謝 qingniu 幫助審閱和完成校對。解密優秀的小提琴演奏者模式 為什麼優秀的小提琴演奏者相比普通演奏者更加出色?乙個顯而易見的事先猜測認為,優秀演奏者更為專注於他們的才藝。意思就是說,他們可能更願意花...

如果你很忙,你一定在什麼地方做錯了!

柏林研究專案 早在1990年初,由三名心理學家組成的研究小組突然拜訪了柏林藝術大學 位於西柏林市中心的一所久負盛名的藝術教育機構。他們此行的目的是為了專門研究小提琴演奏者。我們把這個組稱為優秀演奏者小組。violinist diana yukawa 為了便於研究比較,教授和心理學家也會從學校的其他相...