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. PADS Layout如何进行“ECO对比更新”

    我们在画PCB中,经常会遇到要修改封装等操作.不推荐直接在pcb中非ECO模式下修改,这样会和orcad原理图不同步.我们采用修改orcad原理图,然后由pads layout软件来自动修改pads ...

  2. EhLib 的 DbgridEh 影响 其他数据集的Open方法

    DbgridEh 对应数据集ADOTable1,其中有个字段 部门编码,另外增加查找字段比如 部门名称 ADOTable2对应查找数据集,包含 部门编码和 部门名称字段. ADOTable1 打开后, ...

  3. property 的详细使用方法

    property(fget=None, fset=None, fdel=None, doc=None)  俗话说条条大路通罗马,同样是完成一件事,Python 其实提供了好几个方式供你选择. prop ...

  4. LINUX文件格式化读写(文件指针,缓冲)

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  5. vector 函数都有哪些??

    vector 头文件: #include<vector> 因为vector在c++标准模板库,所以还需要加上 : #include<vector> #include<io ...

  6. <NET CLR via c# 第4版>笔记 第19章 可空值类型

    System.Nullable<T> 是结构. 19.1 C# 对可空值类型的支持 C# 允许用问号表示法来声明可空值类型,如: Int32? x = 5; Int32? y = null ...

  7. 201621123010《Java程序设计》第11周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 源代码阅读:多线程程序BounceThread 1.1 BallR ...

  8. 增量打包DOC版

    压缩zip的命令有的系统没有的自己去下载一个,否则关闭压缩zip的命令. 有需要的自行更改,这是满足我需求的. 执行 publish.bat 即可,当然需要将文件清单写好放在 resources.tx ...

  9. 互评Beta版本

    作业要求[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2448] 基于NABCD评论作品,及改进建议 1.杨老师粉丝群.作品:<P ...

  10. mysql sum(if())用法

    原表:id    fenlei     time1      分类1      201303162      分类2      201303163      分类3      201303174    ...