C# 机房重构-ConvertHelper

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Zhang_0507/article/details/81156642

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泛型都是可以的。

猜你喜欢

转载自blog.csdn.net/Zhang_0507/article/details/81156642