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
と言いますが、問題を混乱させたくありません。
そのため、この2つには概念的に大きな違いがあります。キーワードnull
は、無効な参照を表します。クラスSystem.DbNull
は、データベースフィールドに存在しない値を表します。一般的に、2つの非常に異なる概念(この場合、データベースフィールドに存在しない値に対する無効な参照)を表すために同じもの(この場合はnull
)を使用しないでください。
多くの人が一般的に null object pattern を使用することを提唱している理由はこれであることに注意してください。これはまさに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」の2つの表現があると、明らかな利点が得られない悪い設計です。
DBNull.Valueは、.NETデータベースプロバイダーがデータベースのnullエントリを表すために返すものです。 DBNull.Valueはnullではなく、データベース行から取得された列値のnullとの比較は機能しません。常にDBNull.Valueと比較する必要があります。
http://msdn.Microsoft.com/en-us/library/system.dbnull.value.aspx
DataRowにはIsNull()
と呼ばれるメソッドがあります。このメソッドを使用して、データベースに表示されるnullに関して、null値がある場合に列をテストできます。
DataRow["col"]==null
は常にfalse
になります。
つかいます
DataRow r;
if (r.IsNull("col")) ...
代わりに。
NullはC++のゼロポインターに似ています。したがって、これは参照であり、どの値も指していません。
DBNull.Value
は完全に異なり、フィールド値にNULLが含まれる場合に返される定数です。