web-dev-qa-db-ja.com

nullと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の違いは何ですか?

81
pavanred

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

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

*通常nullと言いますが、問題を混乱させたくありません。

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

多くの人が一般的に null object pattern を使用することを提唱している理由はこれであることに注意してください。これはまさにSystem.DbNullの例です。

102
jason

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

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

20
Heinzi

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つの表現があると、明らかな利点が得られない悪い設計です。

10
Loathing

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

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

5

DataRowにはIsNull()と呼ばれるメソッドがあります。このメソッドを使用して、データベースに表示されるnullに関して、null値がある場合に列をテストできます。

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

つかいます

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

代わりに。

3

NullはC++のゼロポインターに似ています。したがって、これは参照であり、どの値も指していません

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

3
Aliostad