IsNullになっている列から、値を取得
DataRow → DBNullDataRowView → DBNull
結論: DataRow.IsNull(...) == true の場合、DataRow[...] では DBNull 型のインスタンスが返って来る。
※ クラス(例: String)でも値型(例: TimeSpan)でも、DBNull が出て来る。
※ クラス(例: String)の場合、null を突っ込んだ後でも、DBNull が出て来る。
値を設定
結論: 代入で null に設定したい場合は、常に DBNull.Value を渡すのが無難。クラス(例: String)の場合:
[Ok] DataRow ← DBNull
[Ok] DataRowView ← DBNull
[Ok] DataRow ← null
[Ok] DataRowView ← null
値型(例: TimeSpan)の場合:
[Ok] DataRow ← DBNull
[Ok] DataRowView ← DBNull
[例外発生] DataRow ← null
[例外発生] DataRowView ← null
[例外発生] DataRow ← new Nullable<TimeSpan>();
[例外発生] DataRowView ← new Nullable<TimeSpan>();
※ 『追加情報: Column 't' を null に設定できません。DBNull を使用してください。』
オマケ LINQ to DataSet でのクエリ
DataRow.Field<T>("列名");
DataRow.SetField<T>("列名", 値);
T には int? など Nullable が利用できます。
総括
判定は、{クラス・値}、{DataRow・DataRowView}の別に関わらず、DBNull で実施する:- dr["Column"] is DBNull
- drv["Column"] is DBNull
- dr["Column"] = DBNull.Value
- drv["Column"] = DBNull.Value