簡體   English   中英

null 和 System.DBNull.Value 有什么區別?

[英]What is the difference between null and System.DBNull.Value?

null 和 System.DBNull.Value 之間有什么區別嗎? 如果是,那是什么?

我現在注意到了這種行為-

while (rdr.Read())
{
    if (rdr["Id"] != null) //if (rdr["Id"] != System.DBNull.Value)  
    {
        int x = Convert.ToInt32(rdr["Id"]);
    }
}

當我使用 sql datareader 從數據庫中檢索數據時,雖然沒有返回值if(rdr["Id"] != null)返回true並最終引發了將 null 轉換為整數的異常。

但是,如果我使用if (rdr["Id"] != System.DBNull.Value)返回false

null 和 System.DBNull.Value 有什么區別?

好吧, null不是任何類型的實例。 相反,它是一個無效的引用。

但是, System.DbNull.Value是對System.DbNull實例的有效引用( System.DbNull是單例, System.DbNull.Value為您提供對該類的單個實例的引用),它表示不存在的*值數據庫。

*我們通常會說null ,但我不想混淆這個問題。

因此,兩者之間存在很大的概念差異。 關鍵字null表示無效的引用。 System.DbNull類表示數據庫字段中不存在的值。 一般來說,我們應該盡量避免使用相同的東西(在本例中為null )來表示兩個非常不同的概念(在本例中為無效引用與數據庫字段中不存在的值)。

請記住,這就是為什么很多人通常提倡使用空對象模式的原因,這正是System.DbNull的一個例子。

DBNull 類的文檔中:

不要將面向對象編程語言中的 null 概念與 DBNull 對象混淆。 在面向對象的編程語言中,null 表示沒有對對象的引用。 DBNull 表示未初始化的變體或不存在的數據庫列。

DBNull.Value 處理起來很煩人。

我使用靜態方法檢查它是否為 DBNull,然后返回該值。

SqlDataReader r = ...;
String firstName = getString(r[COL_Firstname]);

private static String getString(Object o) {
   if (o == DBNull.Value) return null;
   return (String) o;
}

此外,在向 DataRow 中插入值時,不能使用“null”,必須使用 DBNull.Value。

有兩個“null”表示是一個糟糕的設計,沒有明顯的好處。

DBNull.Value 是 .NET 數據庫提供程序返回以表示數據庫中的空條目。 DBNull.Value 不為空,並且對於從數據庫行檢索的列值與空值的比較將不起作用,您應該始終與 DBNull.Value 進行比較。

http://msdn.microsoft.com/en-us/library/system.dbnull.value.aspx

DataRow 有一個稱為IsNull()的方法,您可以使用該方法測試列是否為空值 - 關於數據庫中看到的空值。

DataRow["col"]==null將始終為false

利用

DataRow r;
if (r.IsNull("col")) ...

反而。

Null 類似於C++ 中的零指針 所以它是一個不指向任何值的引用

DBNull.Value完全不同,它是一個常量,當字段值包含 NULL 時返回。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM