在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
   {
     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]});

   }

   }
}

把两个DataTable连接起来,相当于Sql的Inner Join方法的更多相关文章

  1. [datatable]两个DataTable 连接

    using System; using System.Collections.Generic; using System.Text; using System.Data; namespace Cons ...

  2. 取两个DataTable的交集,删除重复数据

    /// <summary> /// 取两个DataTable的交集,删除重复数据 /// </summary> /// <param name="sourceD ...

  3. 通过两根RS232连接两台电脑

    把RS232的有5脚那边放下面,最左边是GND,第二三是TXD和RXD,两个RS232反接,然后两个usb连接电脑就可以通信了

  4. C# 两个datatable中的数据快速比较返回交集或差集[z]

    最基本的写法无非是写多层foreach循环,数据量多了,循环的次数是乘积增长的. 这里推荐使用Except()差集.Intersect()交集,具体性能没有进行对比. 如果两个datatable的字段 ...

  5. 比较两个DataTable是否相等

    ///   <summary>        ///   比较两个DataTable内容是否相等,先是比数量,数量相等就比内容         ///   </summary> ...

  6. C# 两个datatable中的数据快速比较返回交集或差集

    转自: https://www.cnblogs.com/lacey/p/5893380.html 如果两个datatable的字段完全一致的话,可以直接使用Except,Intersect //Exc ...

  7. reportConfig.xml两种数据源连接的配置方式

     在reportConfig.xml配置文件中,我们提供了两种数据源连接的配置方式,分别如下: 1.jndi数据源配置(即:在dataSource中配置) 此配置适用于在j2ee的服务器中配置了j ...

  8. ytu 1052: 写一函数,将两个字符串连接(水题,指针练习)

    1052: 写一函数,将两个字符串连接 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 343  Solved: 210[Submit][Status][ ...

  9. c# 合并两个DataTable

    当两个DataTable 结构相同可以用自带方法(Merge)合并 // // 摘要: // 将指定的 System.Data.DataTable 与当前的 DataTable 合并,指示是否在当前的 ...

随机推荐

  1. 自由软件VS开源软件

    自由软件VS开源软件 “自由软件运动”是一项倡导软件这种知识产品应该免费共享的社会运动,它主要是从社会伦理学,道德的高度,强调我们每个人都有自由使用软件的权利.这种权利不应该被软件私有所破坏. 反对软 ...

  2. UML系列01之 UML用例图

    UML,全称是Unified Modeling Language,中文是"统一建模语言".通俗点说,UML是一种创建模型的语言. UML是在开发阶段,说明,可视化,构建和书写一个面 ...

  3. android sqlite 怎么写入存储时间

    字符串类型2013-12-10 12:12:12 SimpleDateFormat formatter = new SimpleDateFormat ("yyyy-MM-dd"); ...

  4. Passing JavaScript Objects to Managed Code

    Silverlight If the target managed property or input parameter is strongly typed (that is, not typed ...

  5. Android开发之SD卡上文件操作

    1. 得到存储设备的目录:/SDCARD(一般情况下) SDPATH=Environment.getExternalStorageDirectory()+"/"; 2. 判断SD卡 ...

  6. Android eclipse中程序调试

    一:断点调试 用eclipse开发android程序的时,跟VS一样是可以断点单步调试的.步骤如下.1 设置断点:在编码窗体的左边框上用鼠标双击,或者右键点击菜单,选择 Toggle Breakpoi ...

  7. JFreeChart 图表生成实例(饼图、柱状图、折线图、时序图)

    import java.awt.BasicStroke; import java.awt.Color; import java.io.FileOutputStream; import java.io. ...

  8. 利用SOLR搭建企业搜索平台 之——Solr索引基本操作

    来源:http://blog.csdn.net/zx13525079024/article/details/25367239 我们来看下通过界面来操作SOLR,包括SOLR索引的添加,查询等基本操作. ...

  9. Objective-C 类的继承、方法的重写和重载

    一.类的继承 Objective-c中类的继承与C++类似,不同的是Objective-c不支持多重继承,一个类只能有一个父类,单继承使Objective-c的继承关系很简单,易于管理程序.Objec ...

  10. R语言数据类型转换

    test for data type is.numeric(), is.character(), is.vector(), is.matrix(), is.data.frame() convert i ...