首页 > 代码库 > 两个DataTable关联查询(inner join、left join)C#代码

两个DataTable关联查询(inner join、left join)C#代码

  1 using System;  2 using System.Collections.Generic;  3 using System.Text;  4 using System.Data;  5   6 namespace ConsoleApplication1  7 {  8     /// <summary>  9     /// 在返回的table处大断点查看结果 10     /// </summary> 11     class Program 12     { 13         static void Main(string[] args) 14         { 15             CreatTable(); 16         } 17  18         /// <summary> 19         /// 创建两个测试表 20         /// </summary> 21         public static void CreatTable() 22         { 23             //定义数据结构 24             DataTable Ks = new DataTable("客商"); //左表or主表 25             DataColumn dcID = new DataColumn("ID", System.Type.GetType("System.Int32")); 26             DataColumn dcNa = new DataColumn("客商名称", System.Type.GetType("System.String")); 27             Ks.Columns.Add(dcID); 28             Ks.Columns.Add(dcNa); 29  30             DataTable Dj = new DataTable("订单");//右表or子表 31             DataColumn dcID2 = new DataColumn("ID", System.Type.GetType("System.Int32")); 32             DataColumn dcNu = new DataColumn("订单数量", System.Type.GetType("System.Int32")); 33             Dj.Columns.Add(dcID2); 34             Dj.Columns.Add(dcNu); 35  36             //左表数据 37             DataRow KsDt = Ks.NewRow(); 38             KsDt["ID"] = 11; 39             KsDt["客商名称"] = "张三"; 40             Ks.Rows.Add(KsDt); 41  42             KsDt = Ks.NewRow(); 43             KsDt["ID"] = 12; 44             KsDt["客商名称"] = "李四"; 45             Ks.Rows.Add(KsDt); 46  47             KsDt = Ks.NewRow(); 48             KsDt["ID"] = 13; 49             KsDt["客商名称"] = "王武"; 50             Ks.Rows.Add(KsDt); 51  52             KsDt = Ks.NewRow(); 53             KsDt["ID"] = 14; 54             KsDt["客商名称"] = "赵柳"; 55             Ks.Rows.Add(KsDt); 56  57  58             //右表数据 59             KsDt = Dj.NewRow(); 60             KsDt["ID"] = 11; 61             KsDt["订单数量"] = 10; 62             Dj.Rows.Add(KsDt); 63  64             //KsDt = Dj.NewRow(); 65             //KsDt["ID"] = 11; 66             //KsDt["订单数量"] = 12; 67             //Dj.Rows.Add(KsDt); 68  69             //KsDt = Dj.NewRow(); 70             //KsDt["ID"] = 12; 71             //KsDt["订单数量"] = 16; 72             //Dj.Rows.Add(KsDt); 73  74  75             //KsDt = Dj.NewRow(); 76             //KsDt["ID"] = 13; 77             //KsDt["订单数量"] = 30; 78             //Dj.Rows.Add(KsDt); 79  80             KsDt = Dj.NewRow(); 81             KsDt["ID"] = 14; 82             KsDt["订单数量"] = 40; 83             Dj.Rows.Add(KsDt); 84  85             KsDt = Dj.NewRow(); 86             KsDt["ID"] = 15; 87             KsDt["订单数量"] = 1250; 88             Dj.Rows.Add(KsDt); 89  90             /*********************调用******************************************/ 91             // 92             Join(Ks, Dj, new DataColumn[] { Ks.Columns["ID"] }, new DataColumn[] { Dj.Columns["ID"] }); 93             //重载1 94             Join(Ks, Dj, Ks.Columns["ID"], Dj.Columns["ID"]); 95             //重载2 96             Join(Ks, Dj, "ID", "ID"); 97  98             /*********************调用结束**************************************/ 99         }100 101         /// <summary>102         /// 建立两内存表的链接103         /// </summary>104         /// <param name="dt1">左表(主表)</param>105         /// <param name="dt2">右表</param>106         /// <param name="FJC">左表中关联的字段名(字符串)</param>107         /// <param name="SJC">右表中关联的字段名(字符串)</param>108         /// <returns></returns>109         public static DataTable Join(DataTable dt1, DataTable dt2, DataColumn[] FJC, DataColumn[] SJC)110         {111             //创建一个新的DataTable112             DataTable table = new DataTable("Join");113 114             // Use a DataSet to leverage DataRelation115             using (DataSet ds = new DataSet())116             {117                 //把DataTable Copy到DataSet中118                 ds.Tables.AddRange(new DataTable[] { dt1.Copy(), dt2.Copy() });119 120                 DataColumn[] First_columns = new DataColumn[FJC.Length];121                 for (int i = 0; i < First_columns.Length; i++)122                 {123                     First_columns[i] = ds.Tables[0].Columns[FJC[i].ColumnName];124                 }125 126                 DataColumn[] Second_columns = new DataColumn[SJC.Length];127                 for (int i = 0; i < Second_columns.Length; i++)128                 {129                     Second_columns[i] = ds.Tables[1].Columns[SJC[i].ColumnName];130                 }131 132                 //创建关联133                 DataRelation r = new DataRelation(string.Empty, First_columns, Second_columns, false);134                 ds.Relations.Add(r);135 136                 //为关联表创建列137                 for (int i = 0; i < dt1.Columns.Count; i++)138                 {139                     table.Columns.Add(dt1.Columns[i].ColumnName, dt1.Columns[i].DataType);140                 }141 142                 for (int i = 0; i < dt2.Columns.Count; i++)143                 {144                     //看看有没有重复的列,如果有在第二个DataTable的Column的列明后加_Second145                     if (!table.Columns.Contains(dt2.Columns[i].ColumnName))146                         table.Columns.Add(dt2.Columns[i].ColumnName, dt2.Columns[i].DataType);147                     else148                         table.Columns.Add(dt2.Columns[i].ColumnName + "_Second", dt2.Columns[i].DataType);149                 }150 151                 table.BeginLoadData();152                 int itable2Colomns = ds.Tables[1].Rows[0].ItemArray.Length;153                 foreach (DataRow firstrow in ds.Tables[0].Rows)154                 {155                     //得到行的数据156                     DataRow[] childrows = firstrow.GetChildRows(r);//第二个表关联的行157                     if (childrows != null && childrows.Length > 0)158                     {159                         object[] parentarray = firstrow.ItemArray;160                         foreach (DataRow secondrow in childrows)161                         {162                             object[] secondarray = secondrow.ItemArray;163                             object[] joinarray = new object[parentarray.Length + secondarray.Length];164                             Array.Copy(parentarray, 0, joinarray, 0, parentarray.Length);165                             Array.Copy(secondarray, 0, joinarray, parentarray.Length, secondarray.Length);166                             table.LoadDataRow(joinarray, true);167                         }168 169                     }170                     else//如果有外连接(Left Join)添加这部分代码171                     {172                         object[] table1array = firstrow.ItemArray;//Table1173                         object[] table2array = new object[itable2Colomns];174                         object[] joinarray = new object[table1array.Length + itable2Colomns];175                         Array.Copy(table1array, 0, joinarray, 0, table1array.Length);176                         Array.Copy(table2array, 0, joinarray, table1array.Length, itable2Colomns);177                         table.LoadDataRow(joinarray, true);178                         DataColumn[] dc = new DataColumn[2];179                         dc[0] = new DataColumn("");180                     }181                 }182                 table.EndLoadData();183             }184             return table;//***在此处打断点,程序运行后点击查看即可观察到结果185         }186 187         /// <summary>188         /// 重载1189         /// </summary>190         /// <param name="dt1"></param>191         /// <param name="dt2"></param>192         /// <param name="FJC"></param>193         /// <param name="SJC"></param>194         /// <returns></returns>195         public static DataTable Join(DataTable dt1, DataTable dt2, DataColumn FJC, DataColumn SJC)196         {197             return Join(dt1, dt2, new DataColumn[] { FJC }, new DataColumn[] { SJC });198         }199 200         /// <summary>201         /// 重载2202         /// </summary>203         /// <param name="dt1"></param>204         /// <param name="dt2"></param>205         /// <param name="FJC"></param>206         /// <param name="SJC"></param>207         /// <returns></returns>208         public static DataTable Join(DataTable dt1, DataTable dt2, string FJC, string SJC)209         {210             return Join(dt1, dt2, new DataColumn[] { dt1.Columns[FJC] }, new DataColumn[] { dt1.Columns[SJC] });211         }212 213     }214 }

上面运行的结果:

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

两个DataTable关联查询(inner join、left join)C#代码