2014年4月4日金曜日

DataRowやDataRowViewで、DBNullやnullやNullableを設定したり取得したりする件

IsNullになっている列から、値を取得

DataRow → DBNull
DataRowView → 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
代入もDBNullで実施する。
  • dr["Column"] = DBNull.Value
  • drv["Column"] = DBNull.Value

0 件のコメント:

コメントを投稿