最近在做的一个项目中,有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如下:

    /// <summary>
/// 微信消息中的参数
/// </summary>
public class wechatouputpara
{
private String _name = "";
/// <summary>
/// 会员姓名
/// </summary>
public String name
{
get { return _name ; }
set { _name = value; }
} private String _birthday= "";
/// <summary>
/// 会员生日
/// </summary>
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中与其名称相同的属性。

        /// <summary>
/// 将DataTable中的每一列赋值给model中的同名属性
/// DataTable中只有一行数据
/// </summary>
/// <typeparam name="T">泛型:model的类型</typeparam>
/// <param name="objmodel">model的实例</param>
/// <param name="dtInfo">DataTable表</param>
public void TableToModel<T>(T objmodel, DataTable dtInfo)
{
//获取model的类型
Type modelType = typeof(T); //获取model中的属性
PropertyInfo[] modelpropertys = modelType.GetProperties(); //遍历DataTable的每一列
for (Int32 i = ; 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[][i].ToString();
//将表中该列下的数据赋值给model中的同名属性
modelType.GetProperty(name).SetValue(objmodel, value, null);
}
}
}
}

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

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

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

怎样简单灵活地将DataTable中的数据赋值给model的更多相关文章

  1. DataTable中的数据赋值给model z

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

  2. 从DataTable中查询数据

    /// <summary> /// 从DataTable中查询数据 /// </summary> /// <param name="tb">待处 ...

  3. SqlBulkCopy将DataTable中的数据批量插入数据库中

    #region 使用SqlBulkCopy将DataTable中的数据批量插入数据库中 /// <summary> /// 注意:DataTable中的列需要与数据库表中的列完全一致.// ...

  4. 【转载】C#中遍历DataTable中的数据行

    在C#中的Datatable数据变量的操作过程中,有时候我们需要遍历DataTable变量获取每一行的数据值,例如将DataTable变量转换为List集合的时候,我们就会遍历DataTable变量, ...

  5. list转datatable,SqlBulkCopy将DataTable中的数据批量插入数据库

    /// <summary> /// 将泛类型集合List类转换成DataTable /// </summary> /// <param name="list&q ...

  6. DataTable数据赋值给Model通用方法

    注:该文属本人原创,今后项目中发现该方法存在BUG会实时更新,转载记得附上原文出处,方便大家获得最新代码. 相信大家在做项目中,经常会根据不同的表new各种不同的Model,当需要对Model进行实例 ...

  7. c#.net循环将DataGridView中的数据赋值到Excel中,并设置样式

    Microsoft.Office.Interop.Excel.Application excel =                new Microsoft.Office.Interop.Excel ...

  8. 弹框勾选datatable中的数据,点击保存后添加到另一个表中,同一个页面

    需求描述:做编辑的时候,点击添加按钮,弹出数据表table2,勾选弹出框中的数据,点击保存后能够添加到table1中,并且已经被添加到table1中的数据,在弹出框中显示已选,checkbox隐藏:t ...

  9. C#如何对DataTable中的数据进行条件搜索

    经常遇到将数据库中的数据读取到DataTable中的时候再次对DataTable进行条件筛选,下面的筛选的一个例子: DataRow[] dr = dt.Select("token = '& ...

随机推荐

  1. java netty socket库和自定义C#socket库利用protobuf进行通信完整实例

    之前的文章讲述了socket通信的一些基本知识,已经本人自定义的C#版本的socket.和java netty 库的二次封装,但是没有真正的发表测试用例. 本文只是为了讲解利用protobuf 进行C ...

  2. 【Android】纯代码创建页面布局(含异步加载图片)

    开发环境:macOS 10.12 + Android Studio 2.2,MinSDK Android 5.1 先看看总体效果 本示例是基于Fragment进行的,直接上代码: [界面结构] 在 F ...

  3. Xamarin for Visual Studio V3.11.431 于 2015.4.3-2015.4.17 最新发布(Win & Mac)

    Beta Release: April 3 edited April 17 in Visual Studio Released versions: Windows Xamarin.VisualStud ...

  4. ASP.NET的视图(Razor)循环产生html代码

    需要要视图中Razor语法,循环产生一些html代码. 产生后的html是这样的: <li data-transition="> <img src="~/Cont ...

  5. Delphi_05_Delphi_Object_Pascal_基本语法_03

    继续Delphi的学习之旅, 废话不多说,直接贴代码. { Delphi基本语法 1.对象 2.指针 3.类型别名 和 类型转换 } program DelphiObject; {$APPTYPE C ...

  6. 【夯实PHP基础】PHP的反射机制

    本文地址 分享提纲: 1. 介绍 2. 具体例子 2.1 创建Persion类 2.2 反射过程 2.3 反射后使用 1. 介绍 -- PHP5添加了一项新的功能:Reflection.这个功能使得p ...

  7. H5 WebSocket 如何和C#进行通信

    HTML5作为下一代的 Web 标准, 拥有许多引人注目的新特性,如 Canvas.本地存储.多媒体编程接口.WebSocket 等.WebSocket 在浏览器和服务器之间提供了一个基于 TCP 连 ...

  8. vue.js初级入门之最基础的双向绑定操作

    首先在页面引入vue.js以及其他需要用到的或者可能要用到的插件(这里我多引用了bootstrap和jquery) 引用的时候需要注意文件的路径,准备工作这样基本就完成了,下面正式开始入门. vue. ...

  9. 做JavaWeb开发不知Java集合类不如归家种地

    Java作为面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储.但是使用数组存储对象方面具有一些弊端,而Java 集合就像一种容器,可以动态地把多个对象的引用放入容 ...

  10. 初识Message Queue之--基础篇

    之前我在项目中要用到消息队列相关的技术时,一直让Redis兼职消息队列功能,一个偶然的机会接触到了MSMQ消息队列.秉着技术还是专业的好为原则,对MSMQ进行了学习,以下是我个人的学习笔记. 一.什么 ...