- ふらっと C#,C♯,C#(初心者用) Part116 [転載禁止]©2ch.net
674 :デフォルトの名無しさん[sage]:2015/09/12(土) 21:02:49.37 ID:2/bkKms1 - 失礼します。少し長いのですがよろしくお願いします。
C/S型のアプリケーションで「DBから特定のテーブルの内容を読み込む」機能を作成しているのですが、 以下のように記述して問題ないか意見を聞かせてください。 環境は「VS2008」「.NET Framework2.0」「SqlServer2008R2」を使用してます。 (.NET Frameworkのバージョンが古いのですがこれは変更できません・・・) public List<SampleRecClass> ReadData() { string sqlStr = "SELECT id, name ... FROM SampleTable"; SqlConnection conn = new SqlConnection(省略); SqlCommand cmd = new SqlCommand(sqlStr, conn); conn.Open(); SqlDataReader dr = cmd.ExecuteReader(); List<SampleRecClass> list = List<SampleRecClass>(); ※ Type ti = typeof(SampleRecClass); ※ PropertyInfo pi; SampleRecClass data; // [SampleRecClass]は[SampleTable]の項目と名前・型が同じプロパティを持つ while (dr.Read()) { // データの取得にリフレクションを利用する data = new SampleRecClass; ※ for(int i = 0; i < dr.FieldCount; i++){ ※ pi = ti.GetProperty(dr.GetName(i)); ※ if(pi != null){ pi.SetValue(data, dr.GetValue(i), null); } ※ } list.Add(data); } dr.Close(); conn.Close(); return list; } 長いので分割します
| - ふらっと C#,C♯,C#(初心者用) Part116 [転載禁止]©2ch.net
675 :デフォルトの名無しさん[sage]:2015/09/12(土) 21:03:54.91 ID:2/bkKms1 - 直す前の該当箇所のコードは以下のようになっています。
while (dr.Read()) { data = new SampleRecClass; data.id = (int)dr["id"]; data.name = (string)dr["name"]; // (省略) data.項目名 = (型)dr["項目名"]が100行くらい続く list.Add(data); } 気になったのは「data.項目名 = (int)dr["項目名"];」が大量に存在することで、 また、似たようなメソッドをもつクラスが数多く実装されています。 テーブル内容を格納するクラス(サンプルではSampleRecClass)にはテーブルの項目と名前・型が 同じプロパティが存在することからリフレクションを利用すればコードを短く出来るのではないかと考えました。 Select件数は機能によりまちまちで1件の場合もあれば数千となる場合もあります。 一応データの取得自体には成功しているのですが、まわりに熟練した方がおらず、 これはやめたほうが良い、機能追加時に困るなどのご意見をお聞きしたいです。 よろしくお願いします。
| - ふらっと C#,C♯,C#(初心者用) Part116 [転載禁止]©2ch.net
678 :デフォルトの名無しさん[sage]:2015/09/12(土) 22:12:03.95 ID:2/bkKms1 - >>676-677
ありがとうございます。やはりSELECT項目が増えるたびに追加していくのは微妙ですよね。 dapperというのを初めて知りました。やりたいことにものすごい近い気がします。 できればこういうのを導入したいのですが環境に手を加えるのをものすごく嫌がる職場なので説得が必要かも・・・
|
|