DataReader からクラスにマッピングのサンプル

  • 9
    Like
  • 0
    Comment
More than 1 year has passed since last update.

はじめに

IEnumerable から IDataReader へ変換を作成していて、もっと簡単にデータを変換するためDataReaderから指定したクラスにデータを格納するクラスを作ると簡単にデータを変換できると考えサンプルを作成した。
DbExecutorも良かったが、直接クラスに格納した方が手間が省ける。
パラメータもDbExecutor のソースを読んで追加したり、nullの対応をすると便利なツールが作成出来そうだ。

サンプルコード

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Reflection;
using System.Threading.Tasks;
using SampleDataReader.Properties;

namespace SampleDataReader
{

    class DataReaderEnumerable<TSource> 
    {
        private readonly string _sql;
        private readonly string _connectString;
        private readonly List<PropertyInfo> listProp = new List<PropertyInfo>();

        public DataReaderEnumerable(string sql, string connectString)
        {
            _sql = sql;
            _connectString = connectString;
            foreach (var prop in typeof(TSource).GetProperties())
            {
                listProp.Add(prop);
            }
        }

        public IEnumerable<TSource> AsEnumerable()
        {
            using (var conn = new SqlConnection(_connectString))
            {
                conn.Open();
                var cmd = new SqlCommand(_sql, conn);
                using (var rd = cmd.ExecuteReader())
                {
                    while (rd.Read())
                    {
                        TSource cls = Activator.CreateInstance<TSource>();
                        foreach (var fld in listProp)
                            fld.SetValue(cls, rd[fld.Name]);
                        yield return cls;
                    }
                }
            }
        }
    }

    class SampleTable
    {
        public int Field1 { get; set; }
        public string Field2 { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {

            string sql = "SELECT * FROM SampleTable";
            string constr = Settings.Default.xxxConnectionString;
            var cls = new DataReaderEnumerable<SampleTable>(sql, constr);
            foreach (var row in cls.AsEnumerable())
            {
                Console.WriteLine("{0} {1}", row.Field1, row.Field2);
            }

        }
    }
}```