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. C# 接收form表单中多个相同name值的问题

    以前接收form表单的值直接用FormCollection或自定义类来接收,当有多个相同Name的值时会自动用“,”隔开,这样就有了一个问题,当值中本身就含有“,”时就比较难处理了. 所以解决方法就是 ...

  2. net负载均衡服务器架构网址

    https://blog.csdn.net/orichisonic/article/details/71122291 https://blog.csdn.net/huangxiangec/articl ...

  3. XE7 Unit scope names

    今天编译RM报表 7.0 for XE7 ,build设计时包,提示 {$IFDEF JPEG}, JPEG{$ENDIF} 没有找到 JPEG.DCU,这个应该是XE7自带. 后来 在项目选项里,编 ...

  4. PHP excel reader , excel时间转成php时间格式

    最近,在做一个导入功能,在系统中使用PHPExcel类库,读取上传的Excel文件,然后进行字段映射,最后将Excel内的数据导入到系统中.其中,关于日期格式的导入,使我犯了难. 首先,如何导入日期, ...

  5. Quartz表结构说明

    一.表信息解析: 1.1. qrtz_blob_triggers : 以Blob 类型存储的触发器. 1.2. qrtz_calendars:存放日历信息, quartz可配置一个日历来指定一个时间范 ...

  6. 项目使用Nuget,然后SVN checkout后显示缺少引用

    如下图黄色叹号: 解决方案: 1.先生成解决方案 2.执行如下: 这时候Nuget是存在了,但是还是显示缺少引用: 那么最后一步, 输入   :Update-Package -reinstall

  7. POI的简单使用

    一:简介 利用POI工具可以导出word,excel,ppt等office文件 二:程序代码示例 package com.wang.test; import java.io.File; import ...

  8. 51Nod 1066:Bash游戏 (巴什博弈)

    1066 Bash游戏  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 有一堆石子共有N个.A B两个人轮流拿,A先拿.每次最少拿1颗,最多拿K颗,拿到 ...

  9. Descriptor&web.xml

    Deployment Descriptor部署描述符: - 部署描述符是要部署到Web容器或EJB容器的Web应用程序或EJB应用程序的配置文件. - 部署描述符应包含EJB应用程序中所有企业bean ...

  10. java反射+java泛型,封装BaseDaoUtil类。供应多个不同Dao使用

    当项目是ssh框架时,每一个Action会对应一个Service和一个Dao.但是所有的Ation对应的Dao中的方法是相同的,只是要查的表不一样.由于封装的思想,为了提高代码的重用性.可以使用jav ...