熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

C#中的DBNull、Null和String.Empty解釋

2013-11-13 09:50:54  來源: .NET編程 

  對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 這樣返回的是DBNullValue
    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
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.