1. ホーム
  2. .net

DBNullのポイントは何ですか?

2023-09-02 18:28:01

質問

.NETでは null 参照があり、これはオブジェクト参照が空であることを示すためにあらゆる場所で使用されます。 DBNull があり、これはデータベースドライバ(および少数の他のもの)によって...ほとんど同じことを示すために使用されます。当然ながら、これは多くの混乱を引き起こし、変換ルーチンを作り出さなければなりません。

では、なぜオリジナルの.NETの作者はこれを作ることにしたのでしょうか?私にとっては意味がありません。彼らのドキュメントも意味をなしません。

DBNullクラスは存在しない値を表します。データベースでは、例えば、テーブルの行の列はいかなるデータも含んでいないかもしれません。つまり、その列は単に値を持たないのではなく、全く存在しないものとみなされます。DBNull オブジェクトは、存在しない列を表します。さらに、COM interopはDBNullクラスを使用して、存在しない値を示すVT_NULLバリアントと、特定されていない値を示すVT_EMPTYバリアントを区別しています。

列が存在しないとはどういうことですか?列は存在し、特定の行の値を持っていないだけです。存在しないのであれば、特定のセルにアクセスしようとすると例外が発生し、そのセルは DBNull ! を区別する必要があることは理解できます。 VT_NULLVT_EMPTY を作ればいいのに、なぜか COMEmpty クラスを作ったらどうでしょうか。そのほうが、.NETフレームワーク全体がすっきりしますよ。

私は何かを見逃しているのでしょうか?どなたか、なぜ DBNull が発明された理由と、それがどのような問題の解決に役立っているのかを教えてください。

どのように解決するのですか?

ポイントは、特定の状況において、データベースの値が NULL であることと、.NET の NULL であることの間に違いがあることです。

たとえば ExecuteScalar (結果セットの最初の行の最初の列を返す) を使用して、NULLを返した場合、実行されたSQLは何も値を返さなかったことを意味します。もしDBNullが返ってきたら、それはSQLによって返された値がNULLであったことを意味します。この違いを見分けられるようにする必要があります。