我们经常需要从数据库表中取数,取数是以取DataTable的方式,但是我么希望以对象为单位进行这种操作。即存在把取到的DataTable(数据表)转换为ModelList(对象集合)的需求。

原理稍微复杂,因此我画了一下:

这是DataSet中的DataTable

这是DataTable如何转换成ModelList(对象集合),这样我们就能从对象集合里取到对应对象来以对象为单位进行传数

完成此功能需要以下函数:

返回DataTable具体位置的值时需要 NvlReturn函数,这里写了四种,逻辑是判断某个值是否为空值,若不为空值则输出,若为空值,返回指定值(Int Long String Double四种类型)

Int类型

        public static int NvlReturnInt(object obj)
{
try
{
if (obj != null) return obj.ToString().Length == 0 ? 0 : Convert.ToInt32(obj);
return 0;
}
catch
{
return 0;
}
}

Long类型

        public static long NvlReturnLong(object obj)
{
try
{
if (obj != null)
return obj.ToString().Length == 0 ? 0 : Convert.ToInt64(obj);
return 0;
}
catch
{
return 0;
}
}

String类型

        public static string NvlReturnString(object strObject, bool blTrim = false, bool blUpper = false)
{
try
{
if (strObject == null) return string.Empty;
var returnString = strObject.ToString();
if (blTrim) returnString = returnString.Trim();
if (blUpper) returnString = returnString.ToUpper();
return returnString;
}
catch
{
return string.Empty;
}
}

Double类型

        public static double NvlReturnDouble(object obj)
{
try
{
if (obj != null) return obj.ToString().Length == 0 ? 0 : Convert.ToDouble(obj);
return 0;
}
catch
{
return 0;
}
}

把DataTable表的每一行转换成一个对象,这需要我们把每一行的每一个位置一个个输入对象的属性,类似把一个二维表(DataTable)输入一个一维表(对象)的集合,这个表转换成为一个对象的集合,传入的表在这里被称为ThisTable

        public static List<T> ConvertDataTableToModel<T>(DataTable ThisTable)
{ //使用typeof运算符来获取Type对象,只需要提供类型名作为操作数,会返回Type对象的引用
//var ModelType = typeof运算(XXXClass)希望的Type对象类型;
var ModelType = typeof(T);
if (ThisTable == null || ThisTable.Rows.Count == 0)
return null;
var ModelList = new List<T>(); var DataRowCollection = ThisTable.Rows;
var DataColumnCollection = ThisTable.Columns;
//两层循环来遍历这个二维数组
//第一层循环,循环行
foreach (DataRow DR in DataRowCollection)//DataRow类的DR表示 DataTable 中的一行数据。
{
var a = DR[ThisTable.Columns[0]];//a是这个这么多行里的一行,并且每次循环会换一下(相当于各个行组成个数组,a是i,++a) var Model = ModelType.Assembly.CreateInstance(ModelType.FullName);//从此程序集中查找某个类型,然后使用系统激活器创建它的实例。FullName获取该类型的完全限定名称,包括其命名空间,但不包括程序集
//第二层循环,循环每行中的属性
foreach (var p in Model.GetType().GetProperties())//GetType得到运行时的类,GetProperties返回这个类的所有公共属性。在这一行a中,p是这个属性里的一项,并且每次循环会换一下(相当于属性组成个数组,p是i,++p)
{
if (DR[DataColumnCollection[p.Name]] is DBNull)//Name获取当前成员的名称。p.Name就是当前行当前列的属性名
{
p.SetValue(Model, null);
}
else
{
switch (p.PropertyType.Name)//switch(p这个属性的.属性类型.属性类型名)
{
case "Int":
p.SetValue(Model, PubFunc.NvlReturnInt(DR[DataColumnCollection[p.Name]]));
break;
case "Long":
p.SetValue(Model, PubFunc.NvlReturnLong(DR[DataColumnCollection[p.Name]]));
break;
case "String":
p.SetValue(Model, PubFunc.NvlReturnString(DR[DataColumnCollection[p.Name]]));
break;
case "Double":
p.SetValue(Model, PubFunc.NvlReturnDouble(DR[DataColumnCollection[p.Name]]));
break;
default:
p.SetValue(Model, null);
break;
}
}
ModelList.Add((T)Model);
}
}
return ModelList;
}

使用注意!使用注意!使用注意!使用注意!使用注意!使用注意!

首先,要求数据库中你使用的这张数据表的各个字段,与你要转换成类的类型完全相同,即你的表中字段的名字要与你定义的类的属性一一对应。

举例:(我特意定义了一个数据库中表传数据专用的类(TableInfo),来实现字段与属性的一一对应)

这里是Sqlite可视化应用里显示的数据库表结构

这里是Model层定义的专用类(TableInfo)

这里sqlite数据库表中的字段与专用类(TableInfo)中的属性必须一一对应!

我原本用来作为传输单位的类(UserInfo)结构比这个特地定义的数据库中表传数据专用的类(TableInfo)包含的属性多一些

然后调用时候的方式是这样的

这个函数返回true,在UI层就可以接收到true的返回值

程序会弹出 登录成功!

DataTable转对象Model的更多相关文章

  1. 再谈使用Emit把Datatable转换为对象集合(List<T>)

    一.前因和存在的问题 前面我写了一篇<使用Emit把Datatable转换为对象集合(List<T>)>的博文,其实起源于我自己编写的一个orm工具(见前面几篇博文有介绍),里 ...

  2. 使用Emit把Datatable转换为对象集合(List<T>)

    Emit生成动态方法部分摘自网上,但是经过修改,加入了对委托的缓存以及类结构的调整,使之调用更简洁方便.大致的思路是:要实现转换datatable到某个指定对象的集合,本质是实现转换一个datarow ...

  3. DataTable转化为Model

    /// <summary> /// 将DataTable转成Model /// </summary> /// <param name="dt"> ...

  4. 对象列表转换为DataTable或DataTable转换为对象列表.

    /**********************************************************************************/ // 说明: 数据转换工具. ...

  5. DataTable转List<Model>通用类

    /// <summary> /// DataTable转List<Model>通用类[实体转换辅助类] /// </summary> public class Mo ...

  6. DataTable转List<Model>通用类【实体转换辅助类】

    /// <summary> /// DataTable转List<Model>通用类[实体转换辅助类] /// </summary> public class Mo ...

  7. datatable转换为list<model> 映射

    using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.R ...

  8. ORM之模型对象Model

    模型对象Model Odoo的模型对象在odoo模块的models.py文件中,最基础的对象是BaseModel; Odoo的模型对象有三个:AbstractModel.Model.Transient ...

  9. DataTable转实体Model,DataRow转实体Model,DataTable转泛型T,DataRow转泛型T

    前言,此方法利用反射将DataRow转成实体,由于反射性能不行,大家就看看就行了吧. 代码来啦 using System; using System.Collections.Generic; usin ...

随机推荐

  1. 使mysql数据库支持简体中文

    永久支持简体中文[root@localhost ~]# vim /etc/my.cnf添加如下四行:[client]default-character-set=utf8 [mysql]default- ...

  2. ORA-01000 error

    ORA-01000是最大开放游标错误,是Oracle数据库开发中极为常见的错误. 在Java的上下文中,当应用程序尝试打开更多ResultSet而不是数据库实例上的已配置游标时,会发生这种情况. 解决 ...

  3. POJ-2888 Magic Bracelet(Burnside引理+矩阵优化+欧拉函数+逆元)

    Burnside引理经典好题呀! 题解参考 https://blog.csdn.net/maxwei_wzj/article/details/73024349#commentBox 这位大佬的. 这题 ...

  4. master挂了的话pm2怎么处理 使用pm2方便开启node集群模式

    本文为转载 Introduction As you would probably know, Node.js is a platform built on Chrome's JavaScript ru ...

  5. 微信小程序 封装接口

    1.util-util.js //封装接口 let baseURL = 'http://127.0.0.1:3000/'; //接口路径 let request = function (url, op ...

  6. asp.net core Mvc 增删改查

    1.创建项目 创建Data文件夹 创建实体类Students/cs public class Students { public Guid Id { get; set; } public string ...

  7. Andrdoid中对应用程序的行为拦截实现方式之----从底层C进行拦截

    之前的一篇概要文章中主要说了我这次研究的一些具体情况,这里就不在多说了,但是这里还需要指出的是,感谢一下三位大神愿意分享的知识(在我看来,懂得分享和细致的人才算是大神,不一定是技术牛奥~~) 第一篇: ...

  8. RichViewEdit

    RichViewEdit特殊操作 RichviewEdit 图文保存操作 首先要转换成stream后才能对RichviewEdit进行正确的读和写 function SaveRVFToField(rv ...

  9. BZOJ 2655: calc(拉格朗日插值)

    传送门 解题思路 首先比较容易能想到\(dp\),设\(f[i][j]\)表示前\(j\)个数,每个数\(<=i\)的答案,那么有转移方程:\(f[i][j]=f[i-1][j-1]*i*j+f ...

  10. 2015 ACM/ICPC Asia Regional Changchun Online HDU - 5441 (离线+并查集)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5441 题意:给你n,m,k,代表n个城市,m条边,k次查询,每次查询输入一个x,然后让你一个城市对(u,v ...