文档章节

C#的DataTable操作方法

彭泽0902
 彭泽0902
发布于 2016/11/24 18:47
字数 675
阅读 1
收藏 0

1.将泛型集合类转换成DataTable(表中无数据时使用):

public static DataTable NullListToDataTable(IList list)
        {
            var result = new DataTable();
            if (list.Count <= 0) return result;
            var propertys = list[0].GetType().GetProperties();
            foreach (var pi in propertys)
            {
                if (pi != null)
                {
                    result.Columns.Add(pi.Name, pi.PropertyType);
                }
            }
            for (var i = 0; i < list.Count; i++)
            {
                var tempList = new ArrayList();
                foreach (var pi in propertys)
                {
                    var obj = pi.GetValue(list[i], null);
                    tempList.Add(obj);
                }
                var array = tempList.ToArray();
                result.LoadDataRow(array, true);
            }
            return result;
        }

2.将泛型集合类转换成DataTable(表中有数据时使用):

public static DataTable NoNullListToDataTable<T>(IList<T> list)
        {
            var ds = new DataSet();
            var dt = new DataTable(typeof(T).Name);
            var myPropertyInfo =
                typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
            foreach (var t in list)
            {
                if (t == null) continue;
                var row = dt.NewRow();
                for (int i = 0, j = myPropertyInfo.Length; i < j; i++)
                {
                    var pi = myPropertyInfo[i];
                    var name = pi.Name;
                    if (dt.Columns[name] != null) continue;
                    DataColumn column;
                    if (pi.PropertyType.UnderlyingSystemType.ToString() == "System.Nullable`1[System.Int32]")
                    {
                        column = new DataColumn(name, typeof(int));
                        dt.Columns.Add(column);
                        if (pi.GetValue(t, null) != null)
                            row[name] = pi.GetValue(t, null);
                        else
                            row[name] = DBNull.Value;
                    }
                    else
                    {
                        column = new DataColumn(name, pi.PropertyType);
                        dt.Columns.Add(column);
                        row[name] = pi.GetValue(t, null);
                    }
                }
                dt.Rows.Add(row);
            }
            ds.Tables.Add(dt);
            return ds.Tables[0];
        }

3.表中有数据或无数据时使用,可排除DATASET不支持System.Nullable错误:

public static DataTable ToDataTable<T>(IList<T> list)
        {
            if (list == null || list.Count <= 0)
            {
                var result = new DataTable();
                object temp;
                if (list == null || list.Count <= 0) return result;
                var propertys = list[0].GetType().GetProperties();
                foreach (var pi in propertys)
                {
                    {
                        result.Columns.Add(pi.Name, pi.PropertyType);
                    }
                }
                for (var i = 0; i < list.Count; i++)
                {
                    var tempList = new ArrayList();
                    foreach (var pi in propertys)
                    {
                        var obj = pi.GetValue(list[i], null);
                        tempList.Add(obj);
                    }
                    var array = tempList.ToArray();
                    result.LoadDataRow(array, true);
                }
                return result;
            }
            var ds = new DataSet();
            var dt = new DataTable(typeof(T).Name);
            var myPropertyInfo =
                typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
            foreach (var t in list)
            {
                if (t == null) continue;
                var row = dt.NewRow();
                for (int i = 0, j = myPropertyInfo.Length; i < j; i++)
                {
                    var pi = myPropertyInfo[i];
                    var name = pi.Name;
                    if (dt.Columns[name] != null) continue;
                    DataColumn column;
                    if (pi.PropertyType.UnderlyingSystemType.ToString() == "System.Nullable`1[System.Int32]")
                    {
                        column = new DataColumn(name, typeof(int));
                        dt.Columns.Add(column);
                        if (pi.GetValue(t, null) != null)
                            row[name] = pi.GetValue(t, null);
                        else
                            row[name] = DBNull.Value;
                    }
                    else
                    {
                        column = new DataColumn(name, pi.PropertyType);
                        dt.Columns.Add(column);
                        row[name] = pi.GetValue(t, null);
                    }
                }
                dt.Rows.Add(row);
            }
            ds.Tables.Add(dt);
            return ds.Tables[0];
        }

4.合并相同的DataTable:

public static DataTable MergeSameDatatable(DataTable dataTable1, DataTable dataTable2)
        {
            var newDataTable = dataTable1.Clone();
            var obj = new object[newDataTable.Columns.Count];
            for (var i = 0; i < dataTable1.Rows.Count; i++)
            {
                dataTable1.Rows[i].ItemArray.CopyTo(obj, 0);
                newDataTable.Rows.Add(obj);
            }
            for (var i = 0; i < dataTable2.Rows.Count; i++)
            {
                dataTable2.Rows[i].ItemArray.CopyTo(obj, 0);
                newDataTable.Rows.Add(obj);
            }
            return new DataTable();
        }

5.将两个列不同的DataTable合并成一个新的DataTable :

public static DataTable UniteDataTable(DataTable dt1, DataTable dt2, string dtName)
        {
            var dt3 = dt1.Clone();
            for (var i = 0; i < dt2.Columns.Count; i++)
            {
                dt3.Columns.Add(dt2.Columns[i].ColumnName);
            }
            var obj = new object[dt3.Columns.Count];

            for (int i = 0; i < dt1.Rows.Count; i++)
            {
                dt1.Rows[i].ItemArray.CopyTo(obj, 0);
                dt3.Rows.Add(obj);
            }

            if (dt1.Rows.Count >= dt2.Rows.Count)
            {
                for (var i = 0; i < dt2.Rows.Count; i++)
                {
                    for (var j = 0; j < dt2.Columns.Count; j++)
                    {
                        dt3.Rows[i][j + dt1.Columns.Count] = dt2.Rows[i][j].ToString();
                    }
                }
            }
            else
            {
                for (var i = 0; i < dt2.Rows.Count - dt1.Rows.Count; i++)
                {
                    var dr3 = dt3.NewRow();
                    dt3.Rows.Add(dr3);
                }
                for (var i = 0; i < dt2.Rows.Count; i++)
                {
                    for (var j = 0; j < dt2.Columns.Count; j++)
                    {
                        dt3.Rows[i][j + dt1.Columns.Count] = dt2.Rows[i][j].ToString();
                    }
                }
            }
            dt3.TableName = dtName;
            return dt3;
        }

6.Datatable 转 List<Dictionary<string, object>:

public static List<Dictionary<string, object>> DataTableToListDictory(DataTable table)
        {
            var ld = new List<Dictionary<string, object>>();
            for (var i = 0; i < table.Rows.Count; i++)
            {
                var dic = new Dictionary<string, object>();
                for (var j = 0; j < table.Columns.Count; j++)
                {
                    dic.Add(table.Columns[j].ColumnName, table.Rows[i][j]);
                }
                ld.Add(dic);
            }
            return ld;
        }

 

© 著作权归作者所有

共有 人打赏支持
彭泽0902
粉丝 0
博文 44
码字总数 57771
作品 0
武汉
高级程序员
C#中datatable去重的方法

这篇文章主要介绍了C#中datatable去重的方法,通过两种不同的方法对比分析了datatable去重的技巧,非常具有实用价值,需要的朋友可以参考下 这里主要介绍两种方法: 1 数据库直接去除重复 sele...

donny945
2014/10/27
0
0
c#开发大全、系列文章、精品教程

全栈工程师开发手册 (作者:栾鹏) c#系列教程: c#实现ajax通信:向后台发送JSON字符串,接收响应字符串,并转换为对象 c#文件夹常用操作,属性设置,遍历、压缩 c#获取网页源代码的5种方式...

luanpeng825485697
2017/10/03
0
0
C#使用表参数和存储过程批量导入数据

如果要大量导入数据到数据库,如果每条数据都要和数据库建立-断开连接,那么将会非常费时。 个性化的方法:就是使用表参数和存储过程,特点是非常自由灵活,可以在存储过程中实现所需要的SQL...

C_Sharp大大
2013/08/14
0
0
DataBind数据核心

作者:飞刀 这一节主要是要讲DataBind,这个在ASP.net中是很重要的东东,几乎所有的控件都需要它来控制数据的操作。也可以说是ASP.net的数据核心。 我们先来看一个简单的例子: <% @ Page La...

晨曦之光
2012/03/09
55
0
C#语言:使用EPPlus库将DataTable内容输出到xlsx格式文件

先前工作中遇到一个棘手的问题。之前我写的客户端程序生成xlsx格式文件,使用的方法为在指定计算机上安装Office软件,并通过交互操作Interop的方式调用Office相关COM-API生成xlsx格式文档。但...

北风其凉
2016/12/21
325
0

没有更多内容

加载失败,请刷新页面

加载更多

Redis开发规范

一、键值设计 1.1 key名设计 (1)【建议】: 可读性和可管理性 以业务名(或数据库名)为前缀(防止key冲突),用冒号分隔,比如业务名:表名:id ugc:video:1 (2)【建议】:简洁性 保证语义的前提下...

IT--小哥
24分钟前
1
0
crunch 練習

crunch 10 10 -t 09%%%%%%%% -o tw_mobile_number.lst

BaiyuanLab
39分钟前
0
0
Kafka技术资料总结(不断更新中)

1、Kafka实践:到底该不该把不同类型的消息放在同一个主题中 2、Kafka剖析系列: Kafka剖析(一):Kafka背景及架构介绍 Kafka设计解析(二):Kafka High Availability (上) Kafka设计解析...

九州暮云
今天
2
0
面向对象设计原则(OOP)

单一职责原则(Single responsibility principle)又称单一功能原则。它规定一个类应该只有一个发生变化的原因。 核心原则:低耦合,高内聚。 一个类,应该只有一个引起它变化的原因,也就是...

gackey
今天
5
0
C++ 锁

C++提供了两种常用的锁,std::lock_guard<Lockable &T>和std::unique_lock<Lockable &T>。通常使用场景下,这两个锁用法一致。即,在构造锁对象时上锁,在析构锁对象时解锁。使用户从上锁/解...

yepanl
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部