C#中的DBNull、Null、和String.Empty解释
1.對DBNull的解釋:?
??? 該類用于指示不存在某個已知值(通常在數據庫應用程序中)。
??? 在數據庫應用程序中,空對象是字段的有效值。該類區分空值(空對象)和未初始化值(DBNull.Value實例)。例如,表可以包含具有未初始化字段的記錄。默認情況下,這些未初始化字段具有DBNull值。
??? 該類還可以用于在COM Interop中區分 VT_NULL 變量(與空對象關聯)和 VT_EMPTY? 變量(與DBNull.Value實例關聯)。
??? DBNull? 從不等于任何值。
??? DBNull? 是一個單獨的類,這意味著該類只能存在一個實例。這個唯一的實例是? DBNull.Value。
??? 訪問? SQL? 數據庫的數據密集應用程序必須使用? System.Data.SqlTypes? 類,這些類對空值具有內在支持。
??? DBNull在DotNet是單獨的一個類型,該類只能存在唯一的實例,DBNULL.Value,DBNull唯一作用是可以表示數據庫中的字符串,數 字,或日期,為什么可以表示原因是DotNet儲存這些數據的類(DataRow等)都是以 object 的形式來儲存數據的。對于 DataRow , 它的 row[column] 返回的值永遠不為 null , 要么就是具體的為column 的類型的值 。 要么就是 DBNull 。 所以 row[column].ToString() 這個寫法永遠不會在ToString那里發生NullReferenceException。DBNull 實現了 IConvertible 。但是,除了 ToString 是正常的外,其他的ToXXX都會拋出不能轉換的錯誤。?
?2. 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? System.DBNull.Value
??? null用于判斷Reference? invalidate
?
3.""和String.Empty
??? 這兩個都是表示空字符串,其中有一個重點是string str1="" 和 string str2=null 的區別,這樣定義后,str1是一個空字符串,空字符串是一個特殊的字符串,只不過這個字符串的值為空,在內存中是有準確的指向的,string str2=null,這樣定義后,只是定義了一個string 類的引用,str2并沒有指向任何地方,在使用前如果不實例化的話,都將報錯。
4.Convert.IsDBNull()
??? Convert.IsDBNull()返回有關指定對象是否為 DBNull 類型的指示,即是用來判斷對象是否為DBNULL的。其返回值是True或Flase。
??? 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 是正常的外,其他的ToXXX都會拋出不能轉換的錯誤。
??? 在 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 [url=mailto:username=@name]username=@name[/url] 這樣的sql語句,如果找不到記錄,那么ExecuteScalar則會返回null,所以千萬不要
??? int userid=Convert.ToInt32(cmd.ExecuteScalar());
??? 或者你會這樣寫 SQL 語句:select isnull(id,0) from usertable where [url=mailto:username=@name]username=@name[/url]
??? 但是 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。
轉載于:https://www.cnblogs.com/tweet/archive/2010/01/16/1649429.html
總結
以上是生活随笔為你收集整理的C#中的DBNull、Null、和String.Empty解释的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FreeSql (三十四)CodeFir
- 下一篇: 各种数据库对应的jar包、驱动类名和UR