参照型の列に Nothing を代入すると DBNull になる の続きです。

 前回では、参照型の列に対して Nothing を代入すると DBNull になる。ということを言いました。では、値型の列(System.Int32 型など)ではどうなるのでしょうか。

値型の列には Nothing を設定できない

 値型の列に Nothing を代入したときは「列 '[列名]' を Null に設定できません。DBNull を使用してください。」と ArgumentException が発生しました。値型の列では DBNull として設定してくれないようです。内部で参照型か値型かを判断しているんでしょうね。今度は新規行を追加するときの Nothing の動きについて見てみたいと思います。

新規行を Nothing で追加すると DBNull になる

 まず、新規行を追加(NewRow メソッド)した時の値は DataColumn.DefaultValue プロパティの値が適用されます。では、新規行の各列の値を Nothing で追加した時はどうなるでしょうか。

新規行を Nothing で初期化して追加する
Dim t As New DataTable("Test")
' 参照型と値型の列を追加する処理
t.Rows.Add(New Object() {Nothing, Nothing})

 結果は新規行を追加した時と同じで DefaultValue の値で初期化されました。ということは、値型は新規行を初期化するための Nothing では DBNull として代入されているということになります。新規行を追加する場合と列に値を設定する場合とで動きが異なっていますね。参照型はここでも Nothing が DBNull になりました。

 ここで注意しておかなければいけない事が一つあります。今回は型指定されていない DataSet で試しましたが、型指定されている DataSet の場合は、それ専用の AddRow メソッドが作成されます。それを使用した場合は、各列の型で引数を受け取るため Nothing を指定したときは、その型の既定値で初期化されることになります。ただし、その場合でも参照型の列では DBNull になってしまいます。

 Nothing の挙動にこうも違いがあるとは思いませんでした。Nothing はそれを扱うクラスの実装任せで動いているような感じがします。それを全て把握するのも大変なので、明示的に値を設定した方が楽だと思いました。でも Nothing のいろいろな動きの違いを見つけるのは楽しいです。