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系はおおらかなのだろう。