99

null と System.DBNull.Value に違いはありますか? はいの場合、それは何ですか?

私は今、この動作に気付きました -

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

SQLデータリーダーを使用してデータベースからデータを取得していますが、返された値はif(rdr["Id"] != null)返さtrueれず、最終的にnullを整数としてキャストするための例外がスローされました。

しかし、これを使用するとif (rdr["Id"] != System.DBNull.Value)return false.

null と System.DBNull.Value の違いは何ですか?

4

6 に答える 6

129

まあ、nullどのタイプのインスタンスでもありません。むしろ、これは無効な参照です。

ただし、は、データベースに存在しない*値を表す(はシングルトンであり、そのクラスの単一インスタンスへの参照を提供します)System.DbNull.Valueのインスタンスへの有効な参照です。System.DbNullSystem.DbNullSystem.DbNull.Value

*通常は と言うでしょうがnull、この問題を混乱させたくありません。

したがって、両者には大きな概念上の違いがあります。キーワードnullが無効な参照を表しています。このクラスSystem.DbNullは、データベース フィールドに存在しない値を表しています。null一般に、同じもの (この場合は) を使用して 2 つの非常に異なる概念 (この場合は無効な参照とデータベース フィールド内の存在しない値) を表すことは避けてください。

これが、多くの人が一般的にnull オブジェクト パターンの使用を推奨する理由であり、まさにSystem.DbNullその例です。

于 2011-02-10T14:36:26.537 に答える
23

DBNull クラスのドキュメントから:

オブジェクト指向プログラミング言語の null の概念を DBNull オブジェクトと混同しないでください。オブジェクト指向プログラミング言語では、null はオブジェクトへの参照がないことを意味します。DBNull は、初期化されていないバリアントまたは存在しないデータベース列を表します。

于 2011-02-10T14:38:37.977 に答える
12

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」の表現を2つ持つことは、明らかな利点がないために悪い設計です。

于 2012-06-25T22:34:57.547 に答える
5

DBNull.Value は、データベース内の null エントリを表すために .NET データベース プロバイダーが返すものです。DBNull.Value は null ではなく、データベース行から取得された列値の null との比較は機能しません。常に DBNull.Value と比較する必要があります。

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

于 2011-02-10T14:35:50.677 に答える
3

DataRow にはIsNull()、列に null 値があるかどうかをテストするために呼び出されるメソッドがあります。これは、データベースから見た null に関してです。

DataRow["col"]==null常になりますfalse

使用する

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

代わりは。

于 2011-02-10T14:37:38.197 に答える
3

Null は、C++ のゼロ ポインターに似ています。したがって、値を指していない参照です

DBNull.Valueはまったく異なり、フィールド値に NULL が含まれている場合に返される定数です。

于 2011-02-10T14:38:16.163 に答える