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. L2-003. 月饼

    L2-003. 月饼 月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼.现给定所有种类月饼的库存量.总售价.以及市场的最大需求量,请你计算可以获得的最大收益是多少. 注意:销售时 ...

  2. Java线程机制学习

    前面的文章中总结过Java中用来解决共享资源竞争导致线程不安全的几种常用方式: synchronized: ReentrantLock: ThreadLocal: 这些都是在简单介绍了基本用法的基础上 ...

  3. Dynamic networks | 动态网络

    Dynamic networks reveal key players in aging 系统生物学中的网络分析 网络的拓扑结构:topological properties, 网络的度:whole ...

  4. sql server替换字段中的某个字符

    USE [Vocabulary ] GO --UPDATE [dbo].[table name] --   SET [en] = '' --      ,[cn] ='' -- WHERE --cha ...

  5. Python 同一文件中,有unittest不执行“if __name__ == '__main__”,不生成HTMLTestRunner测试报告的解决方案

    1.问题:Python中同一个.py文件中同时用unittest框架和HtmlReport框架后,HtmlReport不被执行. 2.为什么?其实不是HtmlReport不被执行,也不是HtmlRep ...

  6. Android流媒体开发之路一:Camera2采集摄像头原始数据并手动预览

    Android Camera2采集摄像头原始数据并手动预览 最近研究了一下android摄像头开发相关的技术,也看了Google提供的Camera2Basic调用示例,以及网上一部分代码,但都是在Te ...

  7. .net core部署到Ubuntu

    1.使用vs2017创建Asp.net Core Web应用程序,选择ubuntu中安装的.net core版本,这里选择2.1版本: 2.右键发布该项目,选择文件系统发布: 3.在ubuntu中安装 ...

  8. nginx请求数据超长的问题解决

    参考文章 https://www.cnblogs.com/onmyway20xx/p/4469202.html http://blog.51cto.com/iyull/2129220

  9. error: checker javascript/jshint: can’t parse version string (abnormal termination?)”

    vim 安装插件(k-vim方法 )好后 编辑js文件提示错误 可能是nodejs环境没搭建好 或者版本有误 用nvm安装node 后 需要 source ~/.bashrc 或者重新开一个终端 再运 ...

  10. 奇异值分解(SVD)与在降维中的应用

    奇异值分解(Singular Value Decomposition,SVD)是在机器学习领域广泛应用的算法,它不光可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域.是很多机器 ...