DataRow.Field とConvert.ToInt32 の違いについて、 int がstringになった場合でも同様。
DataRowの値がDBNullかどうかで分ける場合に
var val = (dr["name"] == DBNull.Value) ? "" : Convert.ToString(dr["name"])
とやっていたのだが、
var val = dr.Field<int?>("name") ?? ""
と書けるという記事を発見し、早速使ってみたのだが…
Field版では、データがdecimalの場合にInValidCastExceptionが発生してしまう。値の範囲がintの範囲に収まっているかどうかは関係ない。 利用しているデータがdecimalの桁数指定で定義している箇所がほとんどという性質のため、これでは全く使えないと判明した…
ただ、Convert.ToString(DBNull.Value) はstring.empty(空文字)に、Convert.ToInt32(DBNull.Value)は0になるので、これがOKであればこれが最も手っ取り早いとわかった。
DataRowのFieldやGetValueOrDefaultのようなジェネリクスメソッドは型変換の範囲が厳しく、逆にConvert系はおおらかなのだろう。