一人情シスのつぶやき

名古屋の中小企業で一人情シスをしている作者が、日々の業務で思うことをつぶやきます。

DataRow.Field<int> とConvert.ToInt32 の違い

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