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

namespace Convert.Common
{
public static class DataTableConvert
{
/// <summary>
/// The DataTable type data into a List of <T> entities set t;将DataTable类型的数据转换成List<T>集合 T实体
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dataTable"></param>
/// <returns></returns>
public static List<T> DataTableToList<T>(DataTable dataTable)
{
var list = new List<T>();
var targetType = typeof (T);
var allPropertyArray = targetType.GetProperties();
foreach (DataRow rowElement in dataTable.Rows)
{
var element = Activator.CreateInstance<T>();
foreach (DataColumn columnElement in dataTable.Columns)
{
foreach (var property in allPropertyArray)
{
if (property.Name.ToUpper().Equals(columnElement.ColumnName.ToUpper()))
{
if (rowElement[columnElement.ColumnName] == DBNull.Value ||
rowElement[columnElement.ColumnName] == "")
{
property.SetValue(element, null, null);
}
else
{
if (property.PropertyType == typeof (string))
{
property.SetValue(element, rowElement
[columnElement.ColumnName].ToString(), null);
}
else
{
//typeof(Nullable<decimal>)== typeof(decimal?)
if (property.PropertyType == typeof (decimal?) ||
property.PropertyType == typeof (decimal))
{
property.SetValue(element, decimal.Parse(rowElement
[columnElement.ColumnName].ToString()), null);
}
else if (property.PropertyType == typeof (short?) ||
property.PropertyType == typeof (short))
{
property.SetValue(element, short.Parse(rowElement
[columnElement.ColumnName].ToString()), null);
}
else if (property.PropertyType == typeof (int?) ||
property.PropertyType == typeof (int))
{
property.SetValue(element, int.Parse(rowElement
[columnElement.ColumnName].ToString()), null);
}
else if (property.PropertyType == typeof (DataAction?) ||
property.PropertyType == typeof (DataAction))
{
DataAction? da = null;
foreach (var name in Enum.GetNames(typeof (DataAction)))
{
if (
!string.IsNullOrEmpty(
rowElement[columnElement.ColumnName].ToString()))
{
if (name == rowElement[columnElement.ColumnName].ToString())
{
da =
(DataAction)
Enum.Parse(typeof (DataAction),
rowElement[columnElement.ColumnName]
.ToString(), true);
}
}
}

property.SetValue(element, da, null);
}
}
}
break;
}
}
}

list.Add(element);
}
return list;
}

public static DataSet ListToDataSet<T>(List<T> modelList)
{
if (modelList == null || modelList.Count == 0)
{
return null;
}
var ds = new DataSet();
ds.Tables.Add(ListToDataTable(modelList));
return ds;
}

public static DataTable ListToDataTable<T>(List<T> modelList)
{
if (modelList == null || modelList.Count == 0)
{
return null;
}
var dt = CreateData(modelList[0]);
foreach (var model in modelList)
{
var dataRow = dt.NewRow();
foreach (var propertyInfo in typeof (T).GetProperties())
{
dataRow[propertyInfo.Name] = propertyInfo.GetValue(model, null);
}
dt.Rows.Add(dataRow);
}
return dt;
}

/// <summary>
/// create DataTable by using model
/// </summary>
/// <param name="model">Class entity</param>
/// <returns></returns>
private static DataTable CreateData<T>(T model)
{
var dataTable = new DataTable(typeof (T).Name);
foreach (var propertyInfo in typeof (T).GetProperties())
{
try
{
dataTable.Columns.Add(new DataColumn(propertyInfo.Name.ToUpper(), propertyInfo.PropertyType));
}
catch (Exception)
{
dataTable.Columns.Add(new DataColumn(propertyInfo.Name.ToUpper(), typeof (string)));
}
}
return dataTable;
}

/// <summary>
/// change position of column in data table
/// </summary>
/// <param name="dt"></param>
/// <param name="columnsName"></param>
public static void ChangeDataTableColumnPosition(DataTable dt, string columnsName)
{
var columnNameArry =
columnsName.Trim(' ')
.Trim(' ')
.ToLower()
.Split(new[] {","}, StringSplitOptions.RemoveEmptyEntries)
.ToList();
var tbcol = new List<string>();
var delcol = new List<string>();
var addcol = new List<string>();
if (dt != null && dt.Rows.Count > 0 && columnNameArry.Count > 0)
{
foreach (DataColumn cl in dt.Columns)
{
if (!columnNameArry.Contains(cl.ColumnName.ToLower()))
{
delcol.Add(cl.ColumnName.ToLower());
}
else
{
tbcol.Add(cl.ColumnName.ToLower());
}
}
foreach (var clname in columnNameArry)
{
if (!tbcol.Contains(clname))
{
dt.Columns.Add(clname, typeof (string));
}
}
foreach (var dclname in delcol)
{
dt.Columns.Remove(dclname);
}
for (var i = 0; i < columnNameArry.Count; i++)
{
dt.Columns[columnNameArry[i]].SetOrdinal(i);
}
}
}

/// <summary>
/// change position of column in data table
/// </summary>
/// <param name="dt"></param>
/// <param name="columnsName"></param>
public static DataTable CreateDataTableColumnsName(string columnsName)
{
var dt = new DataTable();
var columnNameArry =
columnsName.Trim(' ')
.Trim(' ')
.ToLower()
.Split(new[] {","}, StringSplitOptions.RemoveEmptyEntries)
.ToList();
foreach (var clname in columnNameArry)
{
dt.Columns.Add(clname, typeof (string));
}
return dt;
}
}
}

DataTable与DataSet之间的转换Class的更多相关文章

  1. C# 中List<T>与DataSet之间的转换

    p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...

  2. 【C#常用方法】2.DataTable(或DataSet)与Excel文件之间的导出与导入(使用NPOI)

    DataTable与Excel之间的互导 1.项目添加NPOI的引用 NPOI项目简介: NPOI是一个开源的C#读写Excel.WORD等微软OLE2组件文档的项目,特点是可以在没有安装Office ...

  3. .Net中List<T> 泛型转成DataTable、DataSet

    在开发过程过程中有时候需要将List<T>泛型转换成DataTable.DataSet,可以利用反射机制将DataTable的字段与自定义类型的公开属性互相赋值. 1.List<T& ...

  4. DataTable与实体类互相转换

    /// <summary> /// DataTable与实体类互相转换 /// </summary> /// <typeparam name="T"& ...

  5. DataTable与DataSet

    转自:http://www.cnblogs.com/rjf1979/archive/2010/09/09/1822667.html DataSet包含很多个DataTable 一张表的时候用DataT ...

  6. Asp.net 将DataTable 或者DataSet 转换为Json 格式

    Web 开发中,将从数据库中取到的数据直接转换为 Json 格式的数据,在前台通过Ajax 无刷新显示在界面上,下面提供将DataTable 或者DataSet 转换为Json 的方法 /// < ...

  7. DataTable和DataSet有什么区别

    DataTable和DataSet有什么区别 DataSet:数据集.一般包含多个DataTable,用的时候,dataset["表名"]得到DataTable   DataTab ...

  8. 【转】DataTable与实体类互相转换

    原文地址:https://www.cnblogs.com/marblemm/p/7084797.html /// <summary> /// DataTable与实体类互相转换 /// & ...

  9. C# DataTable、DataSet、List、相互转换

      DataTable转LIst /// <summary> /// 利用反射将DataTable转换为List<T>对象 /// </summary> /// & ...

随机推荐

  1. public,private,protected,以及default时的区别

    作用域    当前类   同一package     子孙类   其他package public       √                 √                    √    ...

  2. pixi.js(入门)

    1.关于 一个关于HTML5 2D渲染引擎,它的独特之处在于其拥有了canvas回调功能的WebGL,速度快,能够兼容所有设备,简单得说也就是跨平台了,我用的开发工具是WebStorm 2.参考API ...

  3. python @的用法

    来自:https://www.cnblogs.com/jmlovepython/p/7427297.html @相当于在一个函数中调用另一个函数,并执行操作 def funA(x): print(x( ...

  4. zookeeper及kafka集群搭建

    zookeeper及kafka集群搭建 1.有关zookeeper的介绍可参考:http://www.cnblogs.com/wuxl360/p/5817471.html 2.zookeeper安装 ...

  5. 整合Druid数据源

    pom依赖: <!--引入druid数据源--> <!-- https://mvnrepository.com/artifact/com.alibaba/druid --> & ...

  6. SOAP和REST

    SOAP: Simple Object Access Protocol REST: Representation State Transfer SOAP的简单介绍 SOAP可使用多种协议进行传输,用于 ...

  7. 5、SAMBA服务一:参数详解

    ①:SAMBA服务一:参数详解 ②:SAMBA服务二:配置实例 一.SAMBA简介 samba指SMB(Server Message Block,服务器信息块)协议在网络上的计算机之间远程共享Linu ...

  8. BFS 路径记录

    有一迷宫 N*M,要求输出可通行的最短路径. 可以先倒着 BFS 一遍迷宫,这样 dis[] 数组储存的就是各点到迷宫终点的最短距离. 然后再从起点开始 BFS 一遍 dis[] ,只要满足 dis[ ...

  9. laravel StartSession中间件的实现原理

    1. 打开app\Http\Kernel.php,找到StartSession的位置.这里要说一下,middleware中的中间件是都会被执行的,但执行的顺序我不知道,还需看源码来实现 protect ...

  10. [spring源码] 小白级别的源码解析(一)

    一直都在用spring,但是每次一遇到spring深入的问题,就是比较懵的状态.最近花了段时间学习了一下spring源码. 1,spring版本介绍 虽然工作中,一直在用到spring,可能有时候,并 ...