1. public static DataTable Join(DataTable First, DataTable Second, DataColumn[] FJC, DataColumn[] SJC)
  2. {
  3. DataTable table = new DataTable("Join");
  4. using (DataSet ds = new DataSet())
  5. {
  6. ds.Tables.AddRange(new DataTable[] { First.Copy(), Second.Copy() });
  7. DataColumn[] First_columns = new DataColumn[FJC.Length];
  8. for (int i = ; i < First_columns.Length; i++)
  9. {
  10. First_columns[i] = ds.Tables[].Columns[FJC[i].ColumnName];
  11. }
  12. DataColumn[] Second_columns = new DataColumn[SJC.Length];
  13. for (int i = ; i < Second_columns.Length; i++)
  14. {
  15. Second_columns[i] = ds.Tables[].Columns[SJC[i].ColumnName];
  16. }
  17. DataRelation r = new DataRelation(string.Empty, First_columns, Second_columns, false);
  18. ds.Relations.Add(r);
  19.  
  20. for (int i = ; i < First.Columns.Count; i++)
  21. {
  22. table.Columns.Add(First.Columns[i].ColumnName, First.Columns[i].DataType);
  23. }
  24.  
  25. for (int i = ; i < Second.Columns.Count; i++)
  26. {
  27.  
  28. //看看有没有重复的列,如果有在第二个DataTable的Column的列明后加_Second
  29. if (!table.Columns.Contains(Second.Columns[i].ColumnName))
  30. table.Columns.Add(Second.Columns[i].ColumnName, Second.Columns[i].DataType);
  31. else
  32. table.Columns.Add(Second.Columns[i].ColumnName + "_1", Second.Columns[i].DataType);
  33. }
  34. table.BeginLoadData();
  35.  
  36. int itable2Colomns = ;
  37. if (ds.Tables[].Rows.Count > ) {
  38. itable2Colomns = ds.Tables[].Rows[].ItemArray.Length;
  39. }
  40.  
  41. foreach (DataRow firstrow in ds.Tables[].Rows)
  42. {
  43. //得到行的数据
  44. DataRow[] childrows = firstrow.GetChildRows(r);//第二个表关联的行
  45. if (childrows != null && childrows.Length > )
  46. {
  47. object[] parentarray = firstrow.ItemArray;
  48. foreach (DataRow secondrow in childrows)
  49. {
  50. object[] secondarray = secondrow.ItemArray;
  51. object[] joinarray = new object[parentarray.Length + secondarray.Length];
  52. Array.Copy(parentarray, , joinarray, , parentarray.Length);
  53. Array.Copy(secondarray, , joinarray, parentarray.Length, secondarray.Length);
  54. table.LoadDataRow(joinarray, true);
  55. }
  56. }
  57. else//如果有外连接(Left Join)添加这部分代码
  58. {
  59. object[] table1array = firstrow.ItemArray;//Table1
  60. object[] table2array = new object[itable2Colomns];
  61. object[] joinarray = new object[table1array.Length + itable2Colomns];
  62. Array.Copy(table1array, , joinarray, , table1array.Length);
  63. Array.Copy(table2array, , joinarray, table1array.Length, itable2Colomns);
  64. table.LoadDataRow(joinarray, true);
  65. DataColumn[] dc = new DataColumn[];
  66. dc[] = new DataColumn("");
  67. }
  68. }
  69. table.EndLoadData();
  70. }
  71. return table;
  72. }

程序中实现两个DataTable的Left Join效果(修改了,网上第二个DataTable为空,所处的异常)的更多相关文章

  1. 关于vue中的videoPlayer的src视频地址参数动态修改(网上一堆错误方法,被误导很久,自己找到了正确的方法,供大家借鉴)

    方法很简单:相信大家的问题应该是改变src的值吧,动态赋值这一步简单.this.playerOptions['sources'][0]['src'] 就是这一步解决提取src问题,主要部分用绿色框起来 ...

  2. js 购物车中,多件商品数量加减效果修改,实现总价随数量加减改变

    <!DOCTYPE html> <html> <head> <meta charset=UTF-8 /> <title>无标题文档</ ...

  3. C#控制台或应用程序中两个多个Main()方法的可行性方案

    大多数初级程序员或学生都认为在C#控制台或应用程序中只能有一个Main()方法.但是事实上是可以有多个Main()方法的. 在C#控制台或应用程序中,在多个类中,且每个类里最多只能存在一个Main() ...

  4. C#控制台或应用程序中两个多个Main()方法的设置

    大多数初级程序员或学生都认为在C#控制台或应用程序中只能有一个Main()方法.但是事实上是可以有多个Main()方法的. 在C#控制台或应用程序中,在多个类中,且每个类里最多只能存在一个Main() ...

  5. 在Java Web程序中使用监听器可以通过以下两种方法

    之前学习了很多涉及servlet的内容,本小结我们说一下监听器,说起监听器,编过桌面程序和手机App的都不陌生,常见的套路都是拖一个控件,然后给它绑定一个监听器,即可以对该对象的事件进行监听以便发生响 ...

  6. VC++ 在两个程序中 传送字符串等常量值的方法:使用了 WM_COPYDATA 消息(转载)

    转载:http://www.cnblogs.com/renyuan/p/5037536.html VC++ 在两个程序中 传递字符串等常量值的方法:使用了 WM_COPYDATA 消息的 消息作用:  ...

  7. 为TextView设置两种状态,程序中可以动态切换

    经常会需要用文字的两种状态来表示当前系统的某两种状态.比如:         这里的第一个TextView和后两个TextView就表示了两种状态.我们可以在程序的动态的切换状态(而不是直接修改颜色) ...

  8. 5.把报表集成到Web应用程序中-生成网页和导出两种方式

    转自:https://wenku.baidu.com/view/104156f9770bf78a65295462.html 第四部分,把报表集成到Web应用程序中 用MyEclipse新建一个Web ...

  9. 两种方法:VS2008下C++窗体程序显示控制台的方法——在QT程序中使用cout和cin

    老蔡写了一个基于QT的窗体程序,而过去写的类的调试信息都是用cout显示的,苦于窗体程序无法显示cout信息很多信息都看不到,于是就想到让控制台和窗体同时显示.显示控制台方法如下 1.项目(或者叫“工 ...

随机推荐

  1. [H5表单]html5自带表单验证体验优化及提示气泡修改

    慕课网之前录制的视频,js/jquery各种宽高的理解和应用,最近终于上线了.还有一个html5左侧导航没有上线!最近慕课网系列课程让我录制一个html5表单验证的课程.今天就稍微说一下表单验证!另外 ...

  2. Angular4 step by step.4

    1.官方的模拟远程调用API接口没整出来,干脆自己使用 最新版本 .netcore2.1.0 preview 作为请求地址 2.直接上图懒得沾代码了,等完善后再开放所有源码: 3.使用了Chole.O ...

  3. golang 应用的部署相关技术

    nohup命令 在 linux 下面部署,我们可以利用 nohup 命令,把应用部署在后端,如下所示: nohup ./yourapp & 这样你的应用就跑在了 Linux 系统的守护进程 n ...

  4. Java序列话和反序列化理解(New)

    public interface Serializable {} 该接口没有任何实现方法,是一种标志,instance of  Serializable 会判断object类型 一.序列化和反序列化的 ...

  5. [TJOI2007]小朋友

    题面 Luogu Sol 弦图最大独立集 做法见上篇博客 # include <bits/stdc++.h> # define RG register # define IL inline ...

  6. Python-常用模块1

    今天我们来看一看python中的常用的模块,内容有点多,我会分两天来更新这些知识 一.什么是模块 模块就是我们把装有特定功能的代码就行归类的结果,从代码编写的单位来看我们的程序,从小到大的顺序:一条代 ...

  7. 表单校验常用原生js库

    1.字符串去除左右空格继承形式// 除去左右空格String.prototype.Trim = function() { return this.replace(/(^\s*)|(\s*$)/g, & ...

  8. Html5中 视频 音频标签 进度条问题

    最近项目中使用Html5的video和audio标签来在线播放视频和音频文件,但是遇到个奇葩的问题,页面上播放之后进度条无效, 查看w3c之后发现html代码并没有什么不同,之后猜想如果用静态的htm ...

  9. [小北De编程手记] : Lesson 04 - Selenium For C# 之 API 上

    这一部分,我准备向大家介绍Selenium WebDriver的常用API,学习这部分内容需要大家最好有一些简单的HTML相关知识,本文主要涉及到以下内容: Selenium API:元素检查 Sel ...

  10. Aysnc-callback with future in distributed system

    Aysnc-callback with future in distributed system