###前提・実現したいこと
DataTableにセットされたSQLの結果を、自前のクラスに移し替えたいのですが、
DataRowに詰まっている値の型と、受け手側の型が一致しない為にキャストエラーとなってしまいます。
出来る限りEntityクラスの数値項目等は int か decimal で統一して、
テーブルの桁数変更等の影響を受けないようにしたいのですが、
DBの型とEntityの型を厳密にリンクさせずに、
検索結果をキャストエラーとさせずに取得する方法はないものでしょうか?
Javaで言うBeanUtilsの様なクラスがあれば良いのですが。。。
###発生している問題・エラーメッセージ
指定されたキャストは有効ではありません
###該当のソースコード
対象テーブルの定義
SQL
1Person ( 2 Age NUMBER(3) NOT NULL 3, Name VARCHAR2(20) NOT NULL 4, JobType NUMBER(1) 5, Weight NUMBER(3,3) 6)
実行エラーとなる箇所
c#
1 DataTable dt = selectAllPerson(); 2 BindingList<Person>( 3 dt.AsEnumerable().Select(r => new Person() { 4 Age = (int)(short) r["Age"] // エラーは発生しないが、内部の型を知っている必要があるのでNG 5 , Name = (string) r["Name"] 6 , JobType = r.Field<int?>("JobType") // #キャストエラー (内部がobject{short}) 7 , Weight = r.Field<decimal?>("Weight") // #キャストエラー (内部がobject{float}) 8 }
c#
1class Person { 2 public int Age { get; set; } 3 public string Name { get; set; } 4 public int? JobType { get; set; } 5 public decimal? Weight { get; set; } 6}
###試したこと
キャストエラーとなる部分を色々と書き換えてみましたが、どれも上手くいきませんでした。
// DBNull でエラー , JobType = System.Convert.ToInt32(r["JobType"]) , JobType = ((IConvertible)r["JobType"]).ToInt32(null) // そもそもビルドエラー , JobType = DBNull.Value.Equals(r["JobType"]) ? null : Convert.ToInt32( r["JobType"]) // 値取得はできるが、受け手の型が増える毎にユーティリティメソッドを増やす? , JobType = DbUtility.getInt(r["JobType"]) // ----------------------------------------------------- static int? getInt(object o) { if (DBull.Value.Equals(o)) return null; return System.Convert.ToInt32(o); }
###補足情報(言語/FW/ツール等のバージョンなど)
・VisualStudio2013
・WindowsFormアプリケーション
・最終的にBindingListに保存して、DataGridView.DataSourceにバインドします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。