對DBNull的解釋
該類用於指示不存在某個已知值(通常在數據庫應用程序中)
在數據庫應用程序中空對象是字段的有效值該類區分空值(空對象)和未初始化值(DBNullValue 實例)例如表可以包含具有未初始化字段的記錄默認情況下這些未初始化字段具有 DBNull 值
該類還可以用於在 COM Interop 中區分 VT_NULL 變量(與空對象關聯)和 VT_EMPTY 變量(與 DBNullValue 實例關聯)
DBNull 從不等於任何值
DBNull 是一個單獨的類這意味著該類只能存在一個實例這個唯一的實例是 DBNullValue
訪問 SQL 數據庫的數據密集應用程序必須使用 SystemDataSqlTypes 類這些類對空值具有內在支持
DBNull在DotNet是單獨的一個類型該類只能存在唯一的實例DBNULLValueDBNull唯一作用是可以表示數據庫中的字符串數字或日期為什麼可以表示原因是DotNet儲存這些數據的類(DataRow等)都是以 object 的形式來儲存數據的對於 DataRow 它的 row[column] 返回的值永遠不為 null 要麼就是具體的為column 的類型的值 要麼就是 DBNull 所以 row[column]ToString() 這個寫法永遠不會在ToString那裡發生NullReferenceExceptionDBNull 實現了 IConvertible 但是除了 ToString 是正常的外其他的ToXXX都會拋出不能轉換的錯誤
Null
null 關鍵字是表示不引用任何對象的空引用的文字值null 是引用類型變量的默認值那麼也只有引用型的變量可以為NULL如果 int i=null的話是不可以的因為Int是值類型的
null means the object reference is invalid in NET when you retrieve a NULL value from the Database it is a valid value to NET and it is represented by SystemDBNullValue
null用於判斷Reference invalidate
和StringEmpty
這兩個都是表示空字符串其中有一個重點是string str= 和 string str=null 的區別這樣定義後str是一個空字符串空字符串是一個特殊的字符串只不過這個字符串的值為空在內存中是有准確的指向的string str=null這樣定義後只是定義了一個string 類的引用str並沒有指向任何地方在使用前如果不實例化的話都將報錯
ConvertIsDBNull()
ConvertIsDBNull()返回有關指定對象是否為 DBNull 類型的指示即是用來判斷對象是否為DBNULL的其返回值是True或Flase
DBNull在DotNet是單獨的一個類型 SystemDBNull 它只有一個值 DBNullValue 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(OleDbCommandSqlCommand) 的ExecuteScalar的返回值中情況可以這樣分析
select
這樣返回的object是
select null 這樣返回的是DBNull
Value
select isnull(null
) 返回的是
select top
id from table
這樣返回的值是null
select isnull(id
) from table
where
=
返回的值是null
這裡 ExecuteScalar 的規則就是返回第一列第一行的數據如果第一列第一行不為空那麼ExecuteScalar就直接對應的DotNet的值如果有第一行但是第一列為空那麼返回的是 DBNull 如果一行都沒有那麼ExecuteScalar就返回null
規則就是這樣的這裡容易犯的一個錯誤是把ExecuteScalar返回DBNull與null的情況混淆例如
string username=cmdExecuteScalar()ToString();
除非你認為cmd執行後肯定至少有一行數據否則這裡就會出錯
又或者 select id from usertable where username=@name 這樣的sql語句如果找不到記錄那麼ExecuteScalar則會返回null所以千萬不要
int userid=ConvertToInt(cmdExecuteScalar());
或者你會這樣寫 SQL 語句select isnull(id) from usertable where username=@name
但是 int userid=ConvertToInt(cmdExecuteScalar()); 依然會出錯因為上面的語句不成立時仍然是不返回任何行
對於IDbDataParameter(OleDDbParameterSqlParameter)的Value如果為null則代表該參數沒有指定或者是代表DEFAULT如果為DBNullValue則代表SQL中的NULL
所以如果你要調用存儲過程裡面有參數 @val nvarchar()=AABB
那麼cmdParameters[@val]Value=null 代表使用這個默認的 AABB
而cmdParameters[@val]Value=DBNullValue 代表使用NULL來傳給 @val
你可以用ConvertIsDBNull來判斷一個值是否DBNull注意ConvertIsDBNull(null)是false
From:http://tw.wingwit.com/Article/program/net/201311/11726.html