なんとなく、要望の背景がわかってきたような気がする。
どっちかというと、「DBNull の時に特別な処理をしなければならない」ほうがメインではないですか?
- データセット デザイナで、テーブル デザインを編集する前提です。
- デザイナで指定できる列のデータ タイプに Nullable<> が指定できません。(データベースの型と互換性のある型だけ、なんだろうな)
- System.String 型以外の型では、NullValue に 「(throw exception)」しか選べません。
- このため、VARCHAR 以外の型で NULL を許容する列の時、コードが煩雑になる。
こういった理由のため、次のいずれかのような実装を要望します。
- デザイナが出力するコードの、DataTableRow.Column プロパティを、開発者が上書きできるようにして欲しい。これができれば、どんな型であろうとプロパティを上書きすることで、NULL の処理を望むように行うことができる。
- System.String 以外の型にも、(throw exception) 以外の選択肢を許容して欲しい。System.String の場合は、プロパティ内で IsColumnNull にて検査するように実装されています。その他の型も、同じようなコードを作成するように修正できないでしょうか。(指定された値の型をチェックする方法が難しいかもしれませんが。)
- DBNull と null を相互変換可能にして欲しい。こうすると、NullValue そのものが要らなくなるのでは?
とはいえ、データベース システムにとって NULL は特殊な意味を持ちますから、「他の何かと同等に扱える」のは、混乱のもとだとも思います。特に、初心者にさせてはいけないことだと思います。VARCHAR に限っては、DBMS によって「空文字列は NULL と同等」と扱うものもあるので、NullValue が有るのかもしれませんね。
なんにしても、NULL を、「Column = NULL」では検査できません。NULL に何かを足しても NULL のままです。ORDER するのに NULL は制御できません。このように、DBMS で NULL の扱いが特殊なので、DBNull を特殊だと意識づける必要があると思います。
で。こういうまとめを、読み手にさせるのはどうかと思うのです。
(そういうことをやってるから MVP なのですが)
他にも、「ご要望の背景をお教え下さい」と、開発統括部からお願いされているものがありますよね。
これは、問題の背景、根本となる原因を探っているわけです。
良い喩えではありませんが。
先日、事務所でダニ、ノミが大量発生しました。とりあえず、殺虫剤を撒いたのですが、おさまりません。さて、どうしますか?
island_townさんの要望は、「強力な殺虫剤を作ってください」と喩えることができると思います。それに対して、「ダニやノミが発生している原因はなんですか?その発生源を取り除くことができませんか?」と、問うています。
ちなみに、屋根裏に鳩が巣を作っていることが原因でした。巣を取り除き、入ってくる隙間を埋めて解決です。要望である「殺虫剤を作ること」は満足していませんが、その要望のもとである「ダニ、ノミを取り除く」ことは満足しています。