在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. LightOj 1245 --- Harmonic Number (II)找规律

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1245 题意就是求 n/i (1<=i<=n) 的取整的和这就是到找规律的题 ...

  2. 如何通过图片在 HTTPS 网站中获取 HTTP 接口数据

    <script> (function() { var Decode=function(b){var e;e=[];var a=b.width,c=b.height,d=document.c ...

  3. 数据仓库的自动ETL研究

    但是,在实施数据集成的过程中,由于不同用户提供的数据可能来自不同的途径,其数据内容.数据格式和数据质量千差万别,有时甚至会遇到数据格式不能转换或数据转换格式后丢失信息等棘手问题,严重阻碍了数据在各部门 ...

  4. 加密工具类 - CryptoUtils.java

    加密工具类,包含MD5,BASE64,SHA,CRC32的加密与解密方法. 源码如下:(点击下载  - CryptoUtils.java.commons-io-2.4.jar.commons-code ...

  5. Eclipse 下如何引用另一个项目的资源文件

    为什么要这么做?可参考:Eclipse 下如何引用另一个项目的Java文件 下面直接说下步骤:(项目A 引用 项目B的资源文件) 1.右键 项目A,点击菜单 Properties 2.在弹出的框中,点 ...

  6. [转]c/c++输入函数

    最全输入函数 c/c++ 一: c=getchar(); 功能:读入一个字符 说明:调用此函数时要求在程序的第一行有预编译命令:#include<stdio>,不过在做c++时 有#inc ...

  7. Volley HTTP库系列教程(2)Volley.newRequestQueue示例,发请求的流程,取消请求

    Sending a Simple Request Previous  Next This lesson teaches you to Add the INTERNET Permission Use n ...

  8. BZOJ 1047 理想的正方形(单调队列)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1047 题意:给出一个n*m的矩阵.在所有K*K的子矩阵中,最大最小差值最小的是多少? 思 ...

  9. 配置Tomcat 中文字符集问题

    找到Tomcat安装路径下的conf文件夹下的server.xml配置文件,修改配置Tomcat端口的标签"Connector",添加URIEncoding属性,代码如下: < ...

  10. As of ADT 14, resource fields cannot be used as switch cases

        在导入Android Sample的ApiDemos的时候,发现R.id.xx的文件不能够在 switch cases 中使用 在google查询了下,找到以下答案: As of ADT 14 ...