`
lianxiangbus
  • 浏览: 528808 次
文章分类
社区版块
存档分类
最新评论

多个DataTable的合并成一个新表

 
阅读更多

转自:http://www.cnblogs.com/JuneZhang/archive/2011/12/11/2284243.html

有时我们知道了两个DataTable1和DataTable2,我们希望将它们合并为一个新的DataTable(下面的例子中命名为了newDataTable),这就分为两种情况:DataTable1和DataTable2结构相同、DataTable1和DataTable2结构不同,下面分别介绍怎么进行合并。

一、DataTable1和DataTable2结构相同的情况,结构相同我们只需要把两者的数据罗列到一块就可以了

首先初始化相同结构DataTable(测试用的)

        void InitDataTable1(DataTable dt)
        {
            dt.Columns.Add("student_no");
            dt.Columns.Add("student_name");
            dt.Rows.Add("001", "June");
            dt.Rows.Add("002", "zhang");
            dt.Rows.Add("003", "jun");
        }
        void InitDataTable2(DataTable dt)
        {
            dt.Columns.Add("student_no");
            dt.Columns.Add("student_name");
            dt.Rows.Add("111", "ABC");
            dt.Rows.Add("222", "XYZ");
            dt.Rows.Add("333", "OPQ");
        }

合并方法1:用Rows.Add方法

            DataTable newDataTable = DataTable1.Clone();

            object[] obj = new object[newDataTable.Columns.Count];
            //添加DataTable1的数据
            for (int i = 0; i < DataTable1.Rows.Count; i++)
            {
                DataTable1.Rows[i].ItemArray.CopyTo(obj, 0);
                newDataTable.Rows.Add(obj);
            }
            //添加DataTable2的数据
            for (int i = 0; i < DataTable2.Rows.Count; i++)
            {
                DataTable2.Rows[i].ItemArray.CopyTo(obj, 0);
                newDataTable.Rows.Add(obj);
            }

合并方法2:用DataTable.ImportRow方法

            //拷贝DataTable1的结构和数据
            DataTable newDataTable = DataTable1.Copy();
            //添加DataTable2的数据
            foreach (DataRow dr in DataTable2.Rows)
            {
                newDataTable.ImportRow(dr);
            }

其实添加DataTable1的结构和数据有两种方法

            //克隆DataTable1的结构
            DataTable newDataTable = DataTable1.Clone();

            object[] obj = new object[newDataTable.Columns.Count];
            //添加DataTable1的数据
            for (int i = 0; i < DataTable1.Rows.Count; i++)
            {
                DataTable1.Rows[i].ItemArray.CopyTo(obj, 0);
                newDataTable.Rows.Add(obj);
            }

或者直接用自带的Copy方法 DataTable newDataTable = DataTable1.Copy();
二、DataTable1和DataTable2结构不同相同的情况,我们可以先向新表中添加DataTable1的数据,然后再向每行的后面添加添加DataTable2的数据,注意两者的行数不一定相同。

首先初始化相同结构DataTable(测试用的)

        void InitDataTable1(DataTable dt)
        {
            dt.Columns.Add("student_no1");
            dt.Columns.Add("student_name1");
            dt.Rows.Add("001", "June");
            dt.Rows.Add("002", "zhang");
            //dt.Rows.Add("003", "jun");
        }
        void InitDataTable2(DataTable dt)
        {
            dt.Columns.Add("student_no2");
            dt.Columns.Add("student_name2");
            dt.Rows.Add("111", "ABC");
            dt.Rows.Add("222", "XYZ");
            dt.Rows.Add("222", "ASD");
        }

方法(1)先添加第一个表,再添加第二个表

        /// <summary> 
        /// 将两个列不同(结构不同)的DataTable合并成一个新的DataTable 
        /// </summary> 
        /// <param name="DataTable1">表1</param> 
        /// <param name="DataTable2">表2</param> 
        /// <param name="DTName">合并后新的表名</param> 
        /// <returns>合并后的新表</returns> 
        private DataTable UniteDataTable(DataTable DataTable1, DataTable DataTable2, string DTName)
        {
            //克隆DataTable1的结构
            DataTable newDataTable = DataTable1.Clone();
            for (int i = 0; i < DataTable2.Columns.Count; i++)
            {
                //再向新表中加入DataTable2的列结构
                newDataTable.Columns.Add(DataTable2.Columns[i].ColumnName);
            }
            object[] obj = new object[newDataTable.Columns.Count];
            //添加DataTable1的数据
            for (int i = 0; i < DataTable1.Rows.Count; i++)
            {
                DataTable1.Rows[i].ItemArray.CopyTo(obj, 0);
                newDataTable.Rows.Add(obj);
            }

            if (DataTable1.Rows.Count >= DataTable2.Rows.Count)
            {
                for (int i = 0; i < DataTable2.Rows.Count; i++)
                {
                    for (int j = 0; j < DataTable2.Columns.Count; j++)
                    {
                        newDataTable.Rows[i][j + DataTable1.Columns.Count] = DataTable2.Rows[i][j].ToString();
                    }
                }
            }
            else
            {
                DataRow dr3;
                //向新表中添加多出的几行
                for (int i = 0; i < DataTable2.Rows.Count - DataTable1.Rows.Count; i++)
                {
                    dr3 = newDataTable.NewRow();
                    newDataTable.Rows.Add(dr3);
                }
                for (int i = 0; i < DataTable2.Rows.Count; i++)
                {
                    for (int j = 0; j < DataTable2.Columns.Count; j++)
                    {
                        newDataTable.Rows[i][j + DataTable1.Columns.Count] = DataTable2.Rows[i][j].ToString();
                    }
                }
            }
            newDataTable.TableName = DTName; //设置DT的名字 
            return newDataTable;

方法(2)先添加行数多的表。其实我们也可以先判断哪个表的行数多,就先添加哪个表,然后再添加行少的表就可以了。

        /// <summary> 
        /// 将两个列不同(结构不同)的DataTable合并成一个新的DataTable 
        /// </summary> 
        /// <param name="DataTable1">表1</param> 
        /// <param name="DataTable2">表2</param> 
        /// <param name="DTName">合并后新的表名</param> 
        /// <returns>合并后的新表</returns> 
        private DataTable UniteDataTable2(DataTable DataTable1, DataTable DataTable2, string DTName)
        {
            DataTable newDataTable = new DataTable();
            if (DataTable1.Rows.Count > DataTable2.Rows.Count)
            {
                newDataTable = FillData(DataTable1, DataTable2);
            }
            else
            {
                newDataTable = FillData(DataTable2, DataTable1);
            }

            newDataTable.TableName = DTName; //设置DT的名字 
            return newDataTable;
        }

        private DataTable FillData(DataTable dt1, DataTable dt2)
        {
            //克隆DataTable1的结构
            DataTable newDataTable = dt1.Clone();
            for (int i = 0; i < dt2.Columns.Count; i++)
            {
                //再向新表中加入DataTable2的列结构
                newDataTable.Columns.Add(dt2.Columns[i].ColumnName);
            }
            object[] obj = new object[newDataTable.Columns.Count];
            //添加DataTable1的数据
            for (int i = 0; i < dt1.Rows.Count; i++)
            {
                dt1.Rows[i].ItemArray.CopyTo(obj, 0);
                newDataTable.Rows.Add(obj);
            }
            for (int i = 0; i < dt2.Rows.Count; i++)
            {
                for (int j = 0; j < dt2.Columns.Count; j++)
                {
                    newDataTable.Rows[i][j + dt1.Columns.Count] = dt2.Rows[i][j].ToString();
                }
            }
            return newDataTable;
        }

分享到:
评论

相关推荐

    dataset中多个datatable的合并

    可以将excel中多个sheet以datatable存入dataset,最后通过合并datatable将数据合并到一个datatable中,方便使用

    合并两个Datatable

    合并两个Datatable,适合从数据库读取出来的多个Datatable

    C#将Excel中的Sheet进行合并

    C#将Excel表格中的多个Sheet页进行合并

    DataTable多列合并问题轻松搞定

    由于题库的表结构不相同,导致同样的Gridview在显示时不能同时两种不同结构的数据,这时如何在这个固定的GridView中显示不同的数据呢,感兴趣的朋友可以看下本文的解决方法

    .net导出excel多表头设置

    .net对导出excel是表头的设置,可以跨行与跨列设置表头,以及设置多表头

    C# 同时打印多个DATAGRID

    实现多个DATAGRID的联合打印以及打印预览

    C# 操作 Excel 表 和 Access数据库 的范例(用 VS2010 写的)

    ① 一键合并多个Excel表; ② 把excel表快速插入access数据库(整个表插入,而不是一行一行插入,速度超快); ③ Datatable 快速导出 规范的 excel表; ④ 纯代码生成一个不规则的 excel表(合并列、字体加颜色等)...

    sqlserver合并DataTable并排除重复数据的通用方法分享

    网上合并DataTable通用方法的文章很多,结合项目开发中的常用需求,并借鉴网上的做法,写了一个合并DataTable的通用方法,主要功能是合并两个DataTable(结构可以不同,如字段不完全一致),并可以根据某一列值进行...

    tailwind-datatable:使用Tailwind CSS的语义响应式React数据表

    联接相关列:不再强迫用户与数据进行交互,就好像它是电子表格一样,您可以轻松地合并多个列(例如first_name,last_name和email),这样可以更好地利用水平空间并使表脱颖而出。 CSV导出:这对于内部管理工具而言...

    SQL 合并多行记录的相同字段值

    1.从数据库中先查询符合条件的记录,存放于一个DataTable中,在使用c#等开始遍历这张表,利用DataRow中的主键,再去读取相应的符合条件的多条记录,合并这些第二次读取到的记录内容,返回给前面的这个DataRow数据行...

    Asp.net 高级编程学习经验

    28.多活动结果集(MARS,解释为在单个连接上执行多个查询工作,而不是重复的开关数据库的连接,这个在查询多个数据的时候很有用,它的功能并不能并行执行查询,只是串行执行多个查询而已) 29.关于普通和异步执行方式...

    Asp.net操作Excel的一个类库ExcelHelper

    4、Excel单元格的拷贝、删除、插入、合并操作,可以将单个文本值写入单元格,也可以将多个值及其对应Excel单元格的位置信息保存在Hashtable中写入单元格 5、Excel文本框赋值操作,一些Excel控件都没有提供访问...

    ExcelHelper 源码

    4、Excel单元格的拷贝、删除、插入、合并操作,可以将单个文本值写入单元格,也可以将多个值及其对应Excel单元格的位置信息保存在Hashtable中写入单元格 5、Excel文本框赋值操作,一些Excel控件都没有提供访问...

    c# 长江支流的金质打印通

    后期版本将陆续提供XML描述、SQL数据源的打印,并用管理器管理任意多个网格、文本对象、图象等,用户可以随意定义。 主要功能: 打印、预览,可以调整打印页面设置、打印机设置、显示打印预览对话框 主标题、副...

    MIS金质打印王

    后期版本将陆续提供XML描述、SQL数据源的打印,并用管理器管理任意多个网格、文本对象、图象等,用户可以随意定义。 功能特点: 打印、预览、页面设置对话框 可以指定每个对象是否每页重复打印 可以调整套打 可以每...

    MISGoldPrinterV1.1免费源码版

    网上找到,也许你会用得到。以下是说明 本程序为通用打印程序,单据、会计凭证、发票清单、报表、... 后期版本将提供XML描述、SQL数据源的打印,并用管理器管理任意多个网格、文本对象、图象等,用户可以随意定义。

    《零基础学ASP.NET 2.0》第13章 ADO.NET 2.0对象

    13.5.6 多个DataAdapter对象填充同一DataSet 233 13.5.7 将不同的查询填充到同一DataSet 235 13.5.8 合并DataSet 237 13.5.9 复制DataSet 240 13.6 配置应用程序 243 13.7 常见问题 244 13.7.1 介绍Connection对象时...

    C#打印程序源代码

    完整的打印软技能,适合初学者 完成了整体的框架、涉及打印的几个对话框、核心打印程序及几个基本打印... 后期版本将提供XML描述、SQL数据源的打印,并用管理器管理任意多个网格、文本对象、图象等,用户可以随意定义。

Global site tag (gtag.js) - Google Analytics