[英]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.