C# Datatable转list泛型之ConvertHelper方法

Datatable与泛型


封装ConvertHelper

 /// <summary>
    /// 实体转换辅助类
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class ModelConvertHelper
    {
        public List<T> ConvertTomodel<T>(DataTable dt) where T : new()
        {
            //定义集合
            List<T> ts = new List<T>();
            //获得此模型的类型
            Type type = typeof(T);
            //定义一个临时变量
            string tempName = "";
            //遍历datatable中所有的数据行
            foreach (DataRow dr in dt.Rows)
            {
                T t = new T();
                //获得此模型的公共属性
                PropertyInfo[] propertys = t.GetType().GetProperties();
                //遍历所有属性
                foreach (PropertyInfo pi in propertys)
                {
                    //将属性名称赋值给临时变量
                    tempName = pi.Name;
                    //检查datatable是否包含此列
                    if (dt.Columns.Contains(tempName))
                    {
                        //判断此属性是否有setter
                        if (!pi.CanWrite) continue;//改属性不可写,直接跳出
                        //取值
                        object value = dr[tempName];
                        //如果非空,则赋给对象的属性
                        if (value != DBNull.Value)
                        {
                            pi.SetValue(t,value,null);
                        }
                    }

                }
                //对象添加到泛型集合中
                ts.Add(t);
            }
            return ts;

        }
    }


如何调用?
在D层中定义list来接收返回值
然后用 ModelConvertHelper b=new ModelConvertHelper();将datatable转换为list泛型

 public List<Entity.Students> inquiryStudent(Entity.Students students)
        {
            //实例化sqlhelper
            SqlHelper sqlhelper = new SqlHelper();
            SqlParameter[] sqlparams = { new SqlParameter("@cardno", students.Cardno) };
            //sql 语句
            string sql = @"select *from Students where CardNo=@cardno";
            DataTable table = sqlhelper.ExecuteNonQuery(sql, sqlparams, CommandType.Text);
            //将datatable转换为list泛型
            ModelConvertHelper b = new ModelConvertHelper();
            List<Entity.Students> a = b.ConvertTomodel<Entity.Students>(table);
            return a;
        }

区别


接触到的第一个封装好的就是sqlhelper了,然后接触到了convertHelper,感觉很是神奇啊,sqlhelper是将数据库的增删改查封装在一起,那convertHelper是将Datatable转换成list泛型的方法封装在一起,很是方便啊,现在真的能够理解面向对象这个封装的好处了

Datatable


1.DataTable造成了层与层之间严重的耦合
2.如果不用converthelper的话,那么当我不知道数据库的结构(也就是不知道数据库每列的值)时,查询学生信息的时候,我想知道学生的性别是什么,这个时候我写成”DataTable(0).性别”、”DataTable(0).1”、”DataTable(0).2……还是”DataTable(0).Sex”?显然在我不知道D层或数据库中的结构是确定不了哪种形式的取值是对的。
3.在数据很多的情况下,将数据一个一个赋值给实体,将会有很长的代码冗余

ConvertHelper


用ConvertHelper时,在查询结果数据很多的情况下,可以说是省去了很多麻烦,因为不用一个一个的将值赋给实体,直接返回一个List泛型就可以了,再其它层直接调用list泛型就可以获取数据值了,如果数据很短的话,赋值和用list泛型都是可以的。

评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荼白z

感谢老板请我喝咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值