2009-03-20 14 views
3

.NET 2.0 null可能な型がバージョン1からあった場合、最初にDBNull.Valueは必要ありませんか?.NET 2.0 null可能な型とデータベースnull musings

また、RDBMSのnullには.NETのnullも関係しません。 DBNull.Valueは、.NETバージョン1にはすでにnull可能な型があるかどうかに関係なく、何とか必要になります。

答えて

3

もしSystem.Data.DataSetExtensions.dllが何かであれば、NULL値型がその時点で利用可能であった場合、おそらくDBNull.Valueが存在しないと推測しています。あなたが得るDBNull.Valueをに設定し、「foo」というコラムを、持っていたDataRowにそのライブラリの拡張メソッドを使用して

...

row.Field<int?>("foo"); // returns a nullable int set to null 
row.Field<int>("foo"); // throws an InvalidCastException 

のC#と組み合わせるとこれは、もちろん、非常に便利です。 ??データベースnullの代わりにデフォルト値を指定したい場合に使用します。個人的には、IDataReader/IDataRecordで同様の拡張メソッドを実装する時間が無駄でした。

6

nullDBNull.Valueは、どの.NETバージョンでも2つの異なるものです。例えば

public string CustomerName(int Id) 
{ 
    SqlCommand cmd = 
     new SqlCommand("SELECT Name FROM Customer WHERE id = " + custId, conn); 

    object result = cmd.ExecuteScalar(); 

    if (result == null) 
     return "Customer not found"; 

    if (result == System.DBNull.Value) 
     return "Customer found but name is null"; 

    return (string) result; 
} 

Ref

+1

優秀な例。 –

+0

再解析中、null可能な型がバージョン1であった場合、DBNull.Valueの代わりにnullを返すようにSqlCommandを設計できますか? – Hao

+0

@Hao:私の例では2つのケースを区別する方法はありますか? –

7

.NETのNull型は、問題の変数を実際にnullにすることができます。 DBNullは、「別の環境では、この値はnullとみなされました」と言う方法です。 と実際にはを区別する必要があるため、現在のランタイムのネイティブのようにnullまたは "ネイティブ"のnullと通信している別のシステムではヌル型とDBNullは全く異なる目的を果たします。

+0

私は、ADO.NETが単にDBNullの代わりにnullを返すことができなかったケースを見つけることが大変難しいと思っていますが、振り返ってみると、DBNullが良いアイデアであったかどうかは議論の余地があります。 Nullable が.NET 1.0にあった場合、どのようにデザインに影響を与えていたかだけを推測することができます。 –

+0

@binarycoder確かにADO.NET *はnullを返すことができますが、それはもっと具体的なものについて私たちの最愛のnullを適切にするでしょう。タイプと値を完全に共有する1つの環境のように、データベースとアプリケーションを処理することによりどのように利益を得るのかよく分かりません。 –

+0

+1「他の環境で」 – Hao

1

私はこれに本当に同意しません。 .NETで

のNullable型の問題の 変数が実際に nullにすることができます。 DBNullは " の別の環境では、この値はnullであるとみなされた "と言う方法です。我々は 方法が必要になりますので 実際にはnullを区別しない - と我々が を伝える別のシステムでは ヌル、NULL可能なタイプとはDBNull 完全に異なる目的を果たす - 私たちの現在のランタイムへのネイティブで として、または「ネイティブ」はnull。

この区別は、ローカル変数がデータベースからすべてフェッチされているかどうかわからない場合にのみ必要です。変数がデータベースからフェッチされていることがわかっている場合は、nullとDBNullを識別できます。

しかし、違いは、プログラミング言語ではnullが存在しないことと、null == nullが真であることを示すことです。データベースでは、nullは未知の値のようなものを示します。したがって、null == nullはデータベースではfalseです。他の未知の値と等しい場合は、未知の値を伝えることができないため、nullは何もありません。 DBNullがこのように実装され、DBNull.Value == DBNull.Valueがfalseに評価されるかどうかはわかりません。

EDITは

私はちょうどそれをテストし、exspectedとしてはDBNullは動作しません。 DBNull.Value == DBNull.Valueはtrueに評価されますが、データベースのヌルの意味でfalseを返す必要があります。

+0

@ダン実際に私たちはほぼ同じことを言っていると思います。 –

+0

です。 1つのタイプのヌルで行うことはできますが、現在の環境には複数の理由があります。 –

関連する問題