天天看點

dbnull mysql_DBNull和Null的差別

DBNull 類 表示不存在的值。無法繼承此類。 命名空間: System 程式集: mscorlib(在 mscorlib.dll 中) DBNull 類表示一個不存在的值。例如,在資料庫的表中,某一行的某列中可能不包含任何資料。即,該列被視為根本不存在,而不隻是沒有值。一個表示不存在

DBNull 類

表示不存在的值。無法繼承此類。

命名空間: System

程式集: mscorlib(在 mscorlib.dll 中)

DBNull 類表示一個不存在的值。例如,在資料庫的表中,某一行的某列中可能不包含任何資料。即,該列被視為根本不存在,而不隻是沒有值。一個表示不存在的列的 DBNull 對象。此外,COM 互操作使用 DBNull 類來區分 VT_NULL 變量(訓示不存在的值)和 VT_EMPTY 變量(訓示未指定的值)。

DBNull 類型是一個單獨的類,這意味着隻有一個 DBNull 對象存在。DBNull::.Value 成員表示唯一的 DBNull對象。DBNull::.Value 可用于将不存在的值顯式配置設定給資料庫字段,但大多數 ADO.NET 資料提供程式在字段沒有有效值時會自動配置設定 DBNull 值。您可以通過将從資料庫字段檢索到的值傳遞給 DBNull.Value.Equals 方法,确定該字段值是否為 DBNull 值。然而,有些語言和資料庫對象提供一些方法,可以更容易地确定資料庫字段值是否為 DBNull::.Value.這些方法包括 Visual Basic 的 IsDBNull 函數、Convert::.IsDBNull 方法、DataTableReader::.IsDBNull 方法和 IDataRecord::.IsDBNull 方法。

請勿将面向對象的程式設計語言中的 nullNothingnullptrnull 引用(在 Visual Basic 中為 Nothing) 概念與 DBNull對象混淆。在面向對象的程式設計語言中,nullNothingnullptrnull 引用(在 Visual Basic 中為 Nothing) 表示不存在對某個對象的引用。DBNull 則表示未初始化的變量或不存在的資料庫列。

備注

示例

下面的示例調用 DBNull.Value.Equals 方法,來确定聯系人資料庫中的資料庫字段是否具有有效值。如果具有有效值,字段值将被追加到在标簽中輸出的字元串中。

C# 中的用法

private void OutputLabels(DataTable dt)

{

string label;

// Iterate rows of table

foreach (DataRow row in dt.Rows)

{

int labelLen;

label = String.Empty;

label += AddFieldValue(label, row, "Title");

label += AddFieldValue(label, row, "FirstName");

label += AddFieldValue(label, row, "MiddleInitial");

label += AddFieldValue(label, row, "LastName");

label += AddFieldValue(label, row, "Suffix");

label += "/n";

label += AddFieldValue(label, row, "Address1");

label += AddFieldValue(label, row, "AptNo");

label += "/n";

labelLen = label.Length;

label += AddFieldValue(label, row, "Address2");

if (label.Length != labelLen)

label += "/n";

label += AddFieldValue(label, row, "City");

label += AddFieldValue(label, row, "State");

label += AddFieldValue(label, row, "Zip");

Console.WriteLine(label);

Console.WriteLine();

}

}

private string AddFieldValue(string label, DataRow row,

string fieldName)

{

if (! DBNull.Value.Equals(row[fieldName]))

return (string) row[fieldName] + " ";

else

return String.Empty;

}

初學資料庫程式設計我們可能會有一些對"空值"的疑問,比如通過程式設計建立的一個表中所有資料皆顯示為,手動添加并删除文字後又變成了空白;一個字元串類型的字段,明明沒有填值,卻不等于"";用ADO.NET從資料庫中取值,每遇到有的就出錯……這需要我們正确認識。NET和SQL Server中幾種不同的"空值".

1、真正的空值,也就是"沒有輸入的值",可以出現在大多數類型的字段中(如果沒有别的限制條件),SQL server中表示為null,顯示為,手工在SQL server企業管理器中輸入的方法是按Ctrl+0.它在。NET中對應System.DBNull.Value.在T-SQL指令中,判斷一個值是不是空值,要用"is null"而不是"= null";處理空值有個ISNULL函數,它使用指定的值替換null.用ADO.NET從資料庫得到的空值無法自動轉化為空字元串或Nothing,須手動檢測:如果得到System.DBNull.Value,則賦給資料對象Nothing或其它自定義的有意義的值。

2、空字元串(零長度字元串),隻出現在字元串類型(如nvarchar)的字段中,SQL server中表示為'',顯示為空白,手工在SQL server企業管理器中輸入時清空一個單元格即可。它在。NET中對應System.String.Empty,也就是我們常用的"".在T-SQL指令中處理空字元串和處理一般的字元串沒什麼差別。用ADO.NET從資料庫得到的空字元串也和一般的字元串沒什麼差別。

DBNull簡介

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 [email protected] 這樣的sql語句,如果找不到記錄,那麼ExecuteScalar則會傳回null,是以千萬不要

int userid=Convert.ToInt32(cmd.ExecuteScalar());

或者你會這樣寫 SQL 語句:select isnull(id,0) from usertable where [email protected]

但是 int userid=Convert.ToInt32(cmd.ExecuteScalar()); 依然會出錯,因為上面的語句不成立時,仍然是不傳回任何行。

對于IDbDataParameter(OleDDbParameter,SqlParameter)的Value,如果為null,則代表該參數沒有指定,或者是代表DEFAULT.如果為DBNull.Value,則代表SQL中的NULL

dbnull mysql_DBNull和Null的差別

本文原創釋出php中文網,轉載請注明出處,感謝您的尊重!