using System;
using System.Collections.Generic;
using System.Text;
using System.Data; namespace ConsoleApplication1
{
/// <summary>
/// 在返回的table处大断点查看结果
/// </summary>
class Program
{
static void Main(string[] args)
{
CreatTable();
} /// <summary>
/// 创建两个测试表
/// </summary>
public static void CreatTable()
{
//定义数据结构
DataTable Ks = new DataTable("客商"); //左表or主表
DataColumn dcID = new DataColumn("ID", System.Type.GetType("System.Int32"));
DataColumn dcNa = new DataColumn("客商名称", System.Type.GetType("System.String"));
Ks.Columns.Add(dcID);
Ks.Columns.Add(dcNa); DataTable Dj = new DataTable("订单");//右表or子表
DataColumn dcID2 = new DataColumn("ID", System.Type.GetType("System.Int32"));
DataColumn dcNu = new DataColumn("订单数量", System.Type.GetType("System.Int32"));
Dj.Columns.Add(dcID2);
Dj.Columns.Add(dcNu); //左表数据
DataRow KsDt = Ks.NewRow();
KsDt["ID"] = ;
KsDt["客商名称"] = "张三";
Ks.Rows.Add(KsDt); KsDt = Ks.NewRow();
KsDt["ID"] = ;
KsDt["客商名称"] = "李四";
Ks.Rows.Add(KsDt); KsDt = Ks.NewRow();
KsDt["ID"] = ;
KsDt["客商名称"] = "王武";
Ks.Rows.Add(KsDt); KsDt = Ks.NewRow();
KsDt["ID"] = ;
KsDt["客商名称"] = "赵柳";
Ks.Rows.Add(KsDt); //右表数据
KsDt = Dj.NewRow();
KsDt["ID"] = ;
KsDt["订单数量"] = ;
Dj.Rows.Add(KsDt); //KsDt = Dj.NewRow();
//KsDt["ID"] = 11;
//KsDt["订单数量"] = 12;
//Dj.Rows.Add(KsDt); //KsDt = Dj.NewRow();
//KsDt["ID"] = 12;
//KsDt["订单数量"] = 16;
//Dj.Rows.Add(KsDt); //KsDt = Dj.NewRow();
//KsDt["ID"] = 13;
//KsDt["订单数量"] = 30;
//Dj.Rows.Add(KsDt); KsDt = Dj.NewRow();
KsDt["ID"] = ;
KsDt["订单数量"] = ;
Dj.Rows.Add(KsDt); KsDt = Dj.NewRow();
KsDt["ID"] = ;
KsDt["订单数量"] = ;
Dj.Rows.Add(KsDt); /*********************调用******************************************/
//
Join(Ks, Dj, new DataColumn[] { Ks.Columns["ID"] }, new DataColumn[] { Dj.Columns["ID"] });
//重载1
Join(Ks, Dj, Ks.Columns["ID"], Dj.Columns["ID"]);
//重载2
Join(Ks, Dj, "ID", "ID"); /*********************调用结束**************************************/
} /// <summary>
/// 建立两内存表的链接
/// </summary>
/// <param name="dt1">左表(主表)</param>
/// <param name="dt2">右表</param>
/// <param name="FJC">左表中关联的字段名(字符串)</param>
/// <param name="SJC">右表中关联的字段名(字符串)</param>
/// <returns></returns>
public static DataTable Join(DataTable dt1, DataTable dt2, 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[] { dt1.Copy(), dt2.Copy() }); DataColumn[] First_columns = new DataColumn[FJC.Length];
for (int i = ; i < First_columns.Length; i++)
{
First_columns[i] = ds.Tables[].Columns[FJC[i].ColumnName];
} DataColumn[] Second_columns = new DataColumn[SJC.Length];
for (int i = ; i < Second_columns.Length; i++)
{
Second_columns[i] = ds.Tables[].Columns[SJC[i].ColumnName];
} //创建关联
DataRelation r = new DataRelation(string.Empty, First_columns, Second_columns, false);
ds.Relations.Add(r); //为关联表创建列
for (int i = ; i < dt1.Columns.Count; i++)
{
table.Columns.Add(dt1.Columns[i].ColumnName, dt1.Columns[i].DataType);
} for (int i = ; i < dt2.Columns.Count; i++)
{
//看看有没有重复的列,如果有在第二个DataTable的Column的列明后加_Second
if (!table.Columns.Contains(dt2.Columns[i].ColumnName))
table.Columns.Add(dt2.Columns[i].ColumnName, dt2.Columns[i].DataType);
else
table.Columns.Add(dt2.Columns[i].ColumnName + "_Second", dt2.Columns[i].DataType);
} table.BeginLoadData();
int itable2Colomns = ds.Tables[].Rows[].ItemArray.Length;
foreach (DataRow firstrow in ds.Tables[].Rows)
{
//得到行的数据
DataRow[] childrows = firstrow.GetChildRows(r);//第二个表关联的行
if (childrows != null && childrows.Length > )
{
object[] parentarray = firstrow.ItemArray;
foreach (DataRow secondrow in childrows)
{
object[] secondarray = secondrow.ItemArray;
object[] joinarray = new object[parentarray.Length + secondarray.Length];
Array.Copy(parentarray, , joinarray, , parentarray.Length);
Array.Copy(secondarray, , joinarray, parentarray.Length, secondarray.Length);
table.LoadDataRow(joinarray, true);
} }
else//如果有外连接(Left Join)添加这部分代码
{
object[] table1array = firstrow.ItemArray;//Table1
object[] table2array = new object[itable2Colomns];
object[] joinarray = new object[table1array.Length + itable2Colomns];
Array.Copy(table1array, , joinarray, , table1array.Length);
Array.Copy(table2array, , joinarray, table1array.Length, itable2Colomns);
table.LoadDataRow(joinarray, true);
DataColumn[] dc = new DataColumn[];
dc[] = new DataColumn("");
}
}
table.EndLoadData();
}
return table;//***在此处打断点,程序运行后点击查看即可观察到结果
} /// <summary>
/// 重载1
/// </summary>
/// <param name="dt1"></param>
/// <param name="dt2"></param>
/// <param name="FJC"></param>
/// <param name="SJC"></param>
/// <returns></returns>
public static DataTable Join(DataTable dt1, DataTable dt2, DataColumn FJC, DataColumn SJC)
{
return Join(dt1, dt2, new DataColumn[] { FJC }, new DataColumn[] { SJC });
} /// <summary>
/// 重载2
/// </summary>
/// <param name="dt1"></param>
/// <param name="dt2"></param>
/// <param name="FJC"></param>
/// <param name="SJC"></param>
/// <returns></returns>
public static DataTable Join(DataTable dt1, DataTable dt2, string FJC, string SJC)
{
return Join(dt1, dt2, new DataColumn[] { dt1.Columns[FJC] }, new DataColumn[] { dt1.Columns[SJC] });
} }
}

上面运行的结果:

这是通过网上整理的,适合处理两个服务器上的数据关联。欢迎留言。

两个DataTable关联查询(inner join、left join)C#代码的更多相关文章

  1. Mongoose 两个表关联查询aggregate 以及 Mongoose中获取ObjectId

    Mongoose 两个表关联查询aggregate 通常两个表关联查询的时候,是一种一对多的关系,比如订单与订单详情就是一对多的关系,一个订单下面有多个商品 数据模拟 首先我们先将数据模拟出来,先选择 ...

  2. mybatis 使用接口增删改查和两表一对一关联查询

    导包 总配置文件 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration ...

  3. oracle库两个表关联查询时用 count 报错【我】

    oracle数据库,需要对两个表进行关联查询(根据两个字段),结果发现关联后不能改为 count 获取数量,报错如下: 同样的sql换到另外一个数据库就可以(只是因为数据量在千万级,所以很慢,用时40 ...

  4. 175. Combine Two Tables【LeetCode】-LEFT JON 和RIGHT JOIN,两张表关联查询-java -sql入门

    Table: Person +-------------+---------+ | Column Name | Type | +-------------+---------+ | PersonId ...

  5. Yii2中多表关联查询(with、join、joinwith)

    表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order         (id  order_name   custome ...

  6. 关联查询总结,left join 和 inner join 区别和优化

    left join 是做左外关联,主表内容都会显示:符合关联条件的附表内容才会显示出来. inner join 是内关联,没有主表附表的概念:两个表中,同时符合关联条件的数据才会显示出来. left ...

  7. Oracle关联查询关于left/right join的那点事

    /*题外话 --更改foreign key约束定义引用行(delete cascade/delete set null/delete no action),默认delete on action--引用 ...

  8. 2016.1.22 利用LINQ实现DataSet内多张DataTable关联查询操作(目前未发现太大价值)

    DataSet ds = new DataSet(); DataTable t1 = DBFactorySingleton.GetInstance().Factory.GetDataTable(sql ...

  9. mariadb索引、视图、关联查询、备份恢复、外键

    连接查询(两张表关联查询) 在sql语句中,- - 代表注释 内关联查询(查询两张表的交集) select * from 表1 inner join 表2 on 表1.id=表2.id(此处id是表1 ...

随机推荐

  1. iis 7 asp.net ajax post 请求字节过大报错问题解决办法

    遇到一个ajax post 提交新闻资讯类的文章,报 {"Message":"There was an error processing the request.&quo ...

  2. bzoj1081

    题解: 先暴力找规律 然后就一加一减的枚举 代码: #include<bits/stdc++.h> using namespace std; ],p[]; int main() { sca ...

  3. Integer封装类的相关知识

    java中,在一些情况下会有自动装箱与自动拆箱. 自动拆箱/装箱是在编译期,依据代码的语法,决定是否进行拆箱和装箱动作.装箱过程:把基本类型用它们对应的包装类型进行包装,使基本类型具有对象特征.拆箱过 ...

  4. Spring学习(二)--IOC

    一.什么是IOC? 孤傲苍狼总结的理解: https://www.cnblogs.com/xdp-gacl/p/4249939.html 我的理解(不知道对不对哈,不对的话请各位大神指出): IOC往 ...

  5. 如何使用firebug

    什么是Firebug 从事了数年的Web开发工作,越来越觉得现在对WEB开发有了更高的要求.要写出漂亮的HTML代码:要编写精致的CSS样式表展示每个页面模块:要调试javascript给页面增加一些 ...

  6. Texas Instruments matrix-gui-2.0 hacking -- submenu.php

    <?php /* * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ * * * Redistrib ...

  7. PR

    3.1音频轨道与播放 单声道音轨: 立体声音轨:立体声音频文件 3.2 音频过渡 需要先把第一段视频的结尾与第二段视频的开头切除,然后在使用恒定功率. 3.3  调音台的简单使用 调节音频: 显示声音 ...

  8. BZOJ3672: [Noi2014]购票【CDQ分治】【点分治】【斜率优化DP】

    Description 今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会. 全国的城市构成了一棵以SZ市为根的有根树,每个城市与它的 ...

  9. (1)json和pickle序列化模块

    json 和pickle 模块 json和pickle模块下都有4个功能 dumps  <---> loads  (序列化 <--->反序列化) dump <---> ...

  10. [团队项目]SCRUM项目6.0 7.0

    6.0----------------------------------------------------- sprint演示 1.坚持所有的sprint都结束于演示. 团队的成果得到认可,会感觉 ...