一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

DBNULL和NULL(轉(zhuǎn))

 賈朋亮博客 2014-05-26

Null是.net中無效的對象引用。

DBNull是一個類。DBNull.Value是它唯一的實例。它指數(shù)據(jù)庫中數(shù)據(jù)為空(<NULL>)時,在.net中的值。

null表示一個對象的指向無效,即該對象為空對象。

DBNull.Value表示一個對象在數(shù)據(jù)庫中的值為空,或者說未初始化,DBNull.Value對象是指向有效的對象。

DBNull在DotNet是單獨的一個類型 System.DBNull 。它只有一個值 DBNull.Value 。DBNull 直接繼承 Object ,所以 DBNull 不是 string , 不是 int , 也不是 DateTime 。。。

但是為什么 DBNull 可以表示數(shù)據(jù)庫中的字符串,數(shù)字,或日期呢?原因是DotNet儲存這些數(shù)據(jù)的類(DataRow等)都是以 object 的形式來儲存數(shù)據(jù)的。

對于 DataRow , 它的 row[column] 返回的值永遠不為 null , 要么就是具體的為column 的類型的值 。要么就是 DBNull 。 所以 row[column].ToString() 這個寫法永遠不會在ToString那里發(fā)生NullReferenceException,但有可能拋下標越界的異常。

DBNull 實現(xiàn)了 IConvertible 。 但是,除了 ToString 是正常的外,其他的ToXXX都會拋出不能轉(zhuǎn)換的錯誤。

在 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 的規(guī)則就是,返回第一列,第一行的數(shù)據(jù)。如果一行都沒有,那么ExecuteScalar就返回null。如果有第一行,但是第一列為空,那么返回的是 DBNull 。如果第一列第一行不為空,那么ExecuteScalar就直接對應(yīng)的DotNet的值。

規(guī)則就是這樣的。這里容易犯的一個錯誤是,把ExecuteScalar返回DBNull與null的情況混淆,例如:

string username=cmd.ExecuteScalar().ToString();

除非你認為cmd執(zhí)行后,肯定至少有一行數(shù)據(jù),否則這里就會出錯。

又或者 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,則代表該參數(shù)沒有指定,或者是代表DEFAULT。如果為DBNull.Value,則代表SQL中的NULL

所以,如果你要調(diào)用存儲過程,里面有默認參數(shù) @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是不等的。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    欧美日韩精品久久亚洲区熟妇人 | 一级片黄色一区二区三区| 国产精品不卡高清在线观看| 午夜传媒视频免费在线观看| 亚洲精品国产精品日韩| 国内尹人香蕉综合在线| 亚洲精选91福利在线观看| 永久福利盒子日韩日韩| 日韩专区欧美中文字幕| 日韩综合国产欧美一区| 久久精品色妇熟妇丰满人妻91| 一区二区三区免费公开| 夫妻性生活黄色录像视频| 国产午夜精品福利免费不| 黄片免费在线观看日韩| 神马午夜福利免费视频| 99久久婷婷国产亚洲综合精品| 国产精品丝袜美腿一区二区| 国产精品日韩精品最新| 亚洲精品中文字幕无限乱码| 欧美黑人在线精品极品| 国产一级一片内射视频在线| 一区二区三区日韩经典| 久久黄片免费播放大全| 99国产成人免费一区二区| 91亚洲国产成人久久精品麻豆| 国产一区一一一区麻豆| 久久精品国产熟女精品| 国产三级不卡在线观看视频| 蜜臀人妻一区二区三区| 99精品国产自在现线观看| 色婷婷人妻av毛片一区二区三区| 日本一区二区三区黄色| 91在线爽的少妇嗷嗷叫| 久久亚洲成熟女人毛片| 91熟女大屁股偷偷对白| 亚洲中文字幕在线综合视频| 国产精品日韩精品最新| 国产人妻精品区一区二区三区| 又色又爽又无遮挡的视频| 99久久精品久久免费|