博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
怎样简单灵活地将DataTable中的数据赋值给model
阅读量:6423 次
发布时间:2019-06-23

本文共 3104 字,大约阅读时间需要 10 分钟。

        最近在做的一个项目中,有13个方法都需要用到同一种处理方式:通过SQL语句从数据库获取一条指定的数据,并将该数据中的每个值都赋值给一个model,再将这个model中的数据通过微信发送出去。每个方法都会从不同的表中获取数据,需要处理的数据完全不同,因此也对应了13个不同的model。这些model中的每个属性名称是已经给定的,需要将它们post出去,使用微信给定的模板发送消息,因此每个属性的名称必须与微信提供的模板中一致。

 

        下面举个简单的例子来说明当前的情况:

        SQL Server中用来存放数据的其中一个表结构如下(实际的字段有十几个):

create table memberinfo(    member_id          int,    member_name        varchar(20),    member_birthday    varchar(50)    )go

        需要传给微信消息模板的其中一个参数model如下:

///     /// 微信消息中的参数    ///     public class wechatouputpara    {        private String _name = "";        ///         /// 会员姓名        ///         public String name         {            get { return _name ; }            set { _name = value; }        }        private String _birthday= "";        ///         /// 会员生日        ///         public String birthday        {            get { return _birthday; }            set { _birthday= value; }        }    }

        需要达到的最终效果:将数据库memberinfo表中的一条会员信息获取出来,并将姓名member_name赋值给wechatouputpara类的name属性,将生日member_birthday赋值给birthday属性。

        注意:这里只是举了一个简单的例子,实际并不是把某个表中的字段直接转换成某个类的,而是要通过存储过程,将多个表联合查询出的结果进行转换的,并且查询的语句可能比较复杂。这个例子只是为了说明,一个已经存到DataTable里的数据,如何赋值给指定类中的同名属性,仅此而已。

        既然有很多方法都需要用同一种方式处理,那么自然而然要想到有没有一种能够公用的方法,一劳永逸。毕竟每个表的结构是不同的,传回的数据可能多达十几二十几个字段,如果每个方法中,都要将表中每个字段的值依次赋值给model中的对应属性,那么工作量和代码量都会非常大。

 

        我的解决办法如下:

(1)通过SQL语句从表中获取数据时,将每个字段转换为与model中的对应属性相同的名称。

(2)写一个方法,能够将DataTable表中的每一个字段赋值给model中与其名称相同的属性。

(3)使用泛型,将这个方法作为一个公用方法,每个数据表向对应model中赋值时,都可以调用这个方法。

 

        接下来,仍然使用上面列出的简单例子,来说明最终的解决方案。

(1)使用SQL语句获取数据:

select member_name as [name],member_birthday as birthday from memberinfo where member_id = 1

        在代码中,获取到的数据被存到DataTable dtInfo中。

(2)写一个公用方法,实现:将DataTable表中的每一个字段赋值给model中与其名称相同的属性。

///         /// 将DataTable中的每一列赋值给model中的同名属性        /// DataTable中只有一行数据        ///         /// 
泛型:model的类型
/// model的实例 /// DataTable表 public void TableToModel
(T objmodel, DataTable dtInfo) { //获取model的类型 Type modelType = typeof(T); //获取model中的属性 PropertyInfo[] modelpropertys = modelType.GetProperties(); //遍历DataTable的每一列 for (Int32 i = 0; i < dtInfo.Columns.Count; i++) { //遍历model的每一个属性 foreach (PropertyInfo pi in modelpropertys) { String name = pi.Name; //获取属性名称 //若model属性名称与表中的列名相同 if (name == dtInfo.Columns[i].ColumnName) { //获取表中该列对应的数据 object value = dtInfo.Rows[0][i].ToString(); //将表中该列下的数据赋值给model中的同名属性 modelType.GetProperty(name).SetValue(objmodel, value, null); } } } }

(3)在代码中调用公用方法,将DataTable dtInfo中的数据赋值给wechatouputpara类。

//输出参数wechatouputpara objwechatouputpara = new wechatouputpara();//将会员信息赋值给输出参数TableToModel
(objwechatouputpara, dtInfo);

       

        问题解决了,13个类似的方法都可以直接一句话调用这个公用方法,就可以完成赋值操作,是不是简单多了呢?并且,如果数据表的结构发生变化,或者微信消息需要添加、删除参数,只需要修改SQL语句和对应的model即可,不需要去修改对应的赋值语句,非常灵活。

 

转载于:https://www.cnblogs.com/xuxiaona/p/5000144.html

你可能感兴趣的文章
直接读取图层
查看>>
springsecurity 源码解读 之 RememberMeAuthenticationFilter
查看>>
HTML5标准学习 - 编码
查看>>
JS 时间戳转星期几 AND js时间戳判断时间几天前
查看>>
UVa11426 最大公约数之和(正版)
查看>>
mime
查看>>
SQL练习之求解填字游戏
查看>>
DOM
查看>>
关于网上商城开发的随笔记录1
查看>>
UIApplication
查看>>
12:Web及MySQL服务异常监测案例
查看>>
今天写动态canvas柱状图小结
查看>>
激活函数汇总
查看>>
bootstrap 入门
查看>>
redis在PHP中的基本使用案例
查看>>
Linux命令(十一)——Shell程序设计二(循环控制语句)
查看>>
Linux查看文件内容
查看>>
POI生成Excel
查看>>
C#正则学习
查看>>
小奇的糖果(candy)
查看>>