C#中连接两个DataTable,相当于Sql的InnerJoin

    在下面的例子中实现了3个Join方法,其目的是把两个DataTable连接起来,相当于Sql的Inner Join方法,返回DataTable的所有列。
如果两个DataTable中的DataColumn有重复的话,把第二个设置为ColumnName+"_Second",下面是代码,希望对大家有所帮助。
using System;
using System.Data;

namespace WindowsApplication1
{
    public class SQLOps
    {
        public SQLOps()
        {           
        }
        public static DataTable Join (DataTable First, DataTable Second, DataColumn[] FJC, DataColumn[] SJC)
        {
            //创建一个新的DataTable
            DataTable table = new DataTable("Join");
            // Use a DataSet to leverage DataRelation
            using(DataSet ds = new DataSet())
            {
                //把DataTable Copy到DataSet中

                ds.Tables.AddRange(new DataTable[]{First.Copy(),Second.Copy()});

                DataColumn[] parentcolumns = new DataColumn[FJC.Length];

                for(int i = 0; i < parentcolumns.Length; i++)
                {
                    parentcolumns[i] = ds.Tables[0].Columns[FJC[i].ColumnName];
                }
                DataColumn[] childcolumns = new DataColumn[SJC.Length];
                for(int i = 0; i < childcolumns.Length; i++)
                {
                    childcolumns[i] = ds.Tables[1].Columns[SJC[i].ColumnName];
                }

                //创建关联
                DataRelation r = new DataRelation(string.Empty,parentcolumns,childcolumns,false);
                ds.Relations.Add(r);

                //为关联表创建列
                for(int i = 0; i < First.Columns.Count; i++)
                {
                    table.Columns.Add(First.Columns[i].ColumnName, First.Columns[i].DataType);
                }
                for(int i = 0; i < Second.Columns.Count; i++)
                {
                    //看看有没有重复的列,如果有在第二个DataTable的Column的列明后加_Second
                    if(!table.Columns.Contains(Second.Columns[i].ColumnName))
                        table.Columns.Add(Second.Columns[i].ColumnName, Second.Columns[i].DataType);
                    else
                        table.Columns.Add(Second.Columns[i].ColumnName + "_Second", Second.Columns[i].DataType);
                }
                table.BeginLoadData();
                foreach(DataRow firstrow in ds.Tables[0].Rows)
                {
                    //得到行的数据
                    DataRow[] childrows = firstrow.GetChildRows(r);
                    if(childrows != null && childrows.Length > 0)
                    {
                        object[] parentarray = firstrow.ItemArray;
                        foreach(DataRow secondrow in childrows)
                        {
                            object[] secondarray = secondrow.ItemArray;
                            object[] joinarray = new object[parentarray.Length+secondarray.Length];
                            Array.Copy(parentarray,0,joinarray,0,parentarray.Length);
                            Array.Copy(secondarray,0,joinarray,parentarray.Length,secondarray.Length);
                            table.LoadDataRow(joinarray,true);
                        }
                    }
                }
                table.EndLoadData();
            }
            return table;
        }
        public static DataTable Join (DataTable First, DataTable Second, DataColumn FJC, DataColumn SJC)
        {
            return Join(First, Second, new DataColumn[]{FJC}, new DataColumn[]{SJC});
        }
        public static DataTable Join (DataTable First, DataTable Second, string FJC, string SJC)
        {
            return Join(First, Second, new DataColumn[]{First.Columns[FJC]}, new DataColumn[]{First.Columns[SJC]});
        }
    }
}

时间: 2024-11-16 19:10:51

C#中连接两个DataTable,相当于Sql的InnerJoin的相关文章

在C#中把两个DataTable连接起来

作者:浪漫十一狼在下面的例子中实现了3个Join方法,其目的是把两个DataTable连接起来,相当于Sql的Inner Join方法,返回DataTable的所有列.如果两个DataTable中的DataColumn有重复的话,把第二个设置为ColumnName+"_Second",下面是代码,希望对大家有所帮助.using System;using System.Data; namespace WindowsApplication1{    public class SQLOps 

在C#中把两个DataTable连接起来,相当于Sql的Inner Join方法

在下面的例子中实现了3个Join方法,其目的是把两个DataTable连接起来,相当于Sql的Inner Join方法,返回DataTable的所有列.如果两个DataTable中的DataColumn有重复的话,把第二个设置为ColumnName+"_Second",下面是代码,希望对大家有所帮助.using System;using System.Data; namespace WindowsApplication1{    public class SQLOps    {    

C#中把两个DataTable连接起来,相当于Sql的Inner Join方法

在下面的例子中实现了3个Join方法,其目的是把两个DataTable连接起来,相当于Sql的Inner Join方法,返回DataTable的所有列.  如果两个DataTable中的DataColumn有重复的话,把第二个设置为ColumnName+"_Second",下面是代码,希望对大家有所帮助.  using System;  using System.Data;  namespace WindowsApplication1  {      public class SQLO

两张表连接-c#怎么在一个dgv中导入两张csv

问题描述 c#怎么在一个dgv中导入两张csv 两个csv里面的表格格式是一样的,导入第一张到dgv中,再将第二张导入,也就是将两张的内容在一个dgv中显示,我能做到将一个csv导入dgv中,但是再导入一张会覆盖原有的(dgv.datasource=data),不知道怎么样将两个csv的表格在dgv中连接起来,求大神解惑!! 解决方案 将两个csv中的数据读到一个datattable中或ilist中,再绑定就可以了. 解决方案二: 从文件读入,按格摆放数据 解决方案三: 贴出你导入的代码,帮你修

取datatable中的两列

问题描述 取datatable中的两列绑定到gridview中.谁知道?谢谢!!!! 解决方案 解决方案二:没看明白.其它列不用?为什么不在SQL里先筛选.解决方案三:在gridview就设置两个绑定列.绑到你相应的datatable列上.同意一楼的看法..不用的列为啥不在sql里去掉解决方案四:解决方法:可以使用ToTable方法,用法如下:DataTabledt=GetData();//这里假设是获取数据源DataTablenewdt=dt.DefaultView.ToTable(false

水晶报表中如何连接两个表,两个表有一个字段关联,且其他字段不一样

问题描述 水晶报表中如何连接两个表,两个表有一个字段关联,且其他字段不一样如表1report_nopart_specsamplecode表2report_nofile_name想在同一张主表上显示,且有份详细资料节通过SQL语句,目前只能传表1的内容,表2的内容不知道如何传 解决方案 解决方案二:用父子报表关联显示

如何连接两台电脑

如果只是要连接两台电脑,那么无论串口连接.并口连接还是利用两块网卡来实现互联都是可以的.但是,要连接3台以上计算机,那就只好通过集线器(Hub)或交换机(Switch)将各计算机连接在一起了.如果仅仅为了3台机器的联网而购买一个集线器或交换机似乎又显得不太合算.如果采用同轴电缆连接的总线型网络,虽然可以解决问题,并且组网非常简单,硬件成本也十分低廉,但这种网络的可靠性较差,并且传输速率只能达到10Mbps,况且现在市面上出现的100Mbps网卡上都不再提供BNC接口.因此,要不采用同轴电缆连接的

SQL中的两个值得注意的特殊符号

在SQL中,表示字符串得引号强烈建议使用单引号(').虽然MySQL也可以使用双引号("),但是为了和SQL Server和Oracle统一,建议都使用单引号.如果在字符串中也有单引号出现的话,在SQL中需要将其替换为两个单引号(''),DBMS会将其解释为一个单引号的.关于SQL的换行符和字符串连接符,在MySQL.SQL Server和Oracle中均有不同,下面以列表显示.  MySQLSQL ServerOracle换行符\n或\r\n或CHAR(10)CHAR(13)CHR(10)字符

用防火墙如何连接两个局域网

防火墙型号 hillstone M3108 本公司之前的生产网络都是单独的局域网,现在需要从办公网络中能远程连接生产网中的一台操作站,以对生产过程进行监控.经过内部讨论和跟厂家的交流,为了节约成本,我们采用防火墙连接两个网络,用远程桌面的方式实现(被远程连接的操作站设置为无法修改). 线面将配置整理为笔记,供大家分享. 总的来说,需要三步, 第一步是对防火墙本身进行配置,端口地址.策略.默认路由等 第二步是对操作站进行配置,设置好网关.网关地址即为防火墙上与生产网连接的端口地址.因为我们生产网中