kikukawa's diary

都内で活動するシステムエンジニアが書いてます。 興味を持った技術やハマったポイント、自分用メモをつけてます。 最近はweb中心

DataRowから値を取り出すときにdecimalにcastできない

型なしのDataTableにdecimal型のデータを入れた行を追加して、
それをcastで取り出そうとしたら以下のエラー

指定されたキャストは有効ではありません。

//DataTable作成
DataTable dt = new DataTable();
dt.Columns.Add("cd");
dt.Columns.Add("data");

//行を追加
DataRow dr = this._foreCastTable.NewRow();
dr["cd"] = Cd;
dr["data"] = data;
dt.Rows.Add(dr);

//データ取り出し
DataRow[] drs = dt.Select("cd = 'AAA' ")

foreach (DataRow dr in drs){
 decimal data = (decimal)dr["data"] //ここでエラー
 Console.WriteLine( data );
}

DataRowのカラムはobject {string}という型を持っていて内部的にstringらしい。

対処方法
DataTableにカラムを追加するときに、型まで指定すると素直にCastできる

dt.Columns.Add("data");

dt.Columns.Add("data",Type.GetType("System.Decimal"));

にする。

もしくはデータを取り出すときに

decimal data = System.Convert.ToDecimal(dr["data"]);

とすればOKだった