第1张结构ID,Name 数据(1, "nono") (2, "bob") (3, "mic");
第2张表结构ID,Price 数据(1, 10) (2, 6) (3, 7);
想要的表结构:ID,Name,Price 合并后数据(1,"nono",10) (2,"bob",6) (3,"mic",7)
怎么将表结构合并同时把数据也合并到表中呢?看下面的例子:
DataTable dt1 = new DataTable();
dt1.Columns.Add( "ID ", typeof(int));
dt1.Columns.Add( "Name ", typeof(string));
dt1.PrimaryKey = new DataColumn[] { dt1.Columns[0]};
dt1.Rows.Add(1, "nono");
dt1.Rows.Add(2, "bob");
dt1.Rows.Add(3, "mic");
DataTable dt2 = new DataTable();
dt2.Columns.Add( "ID ", typeof(int));
dt2.Columns.Add( "Price ", typeof(decimal));
dt2.PrimaryKey = new DataColumn[] { dt2.Columns[0] };
dt2.Rows.Add(1, 10);
//dt2.Rows.Add(2, 6);
dt2.Rows.Add(3, 7);
DataTable dt3 = dt1.Copy();
dt3.Merge(dt2);//也可以:dt1.Merge(dt2);DataTable dt3=dt1.Copy();
如果数据:第2张表结构ID,Price 数据(1, 10) (2, 6) (3, 7),(3, 8);ID是第一张表的外键,是否能合并?合并的原理大致是什么呢?
求解
按照你贴的代码,dt3完全没有出现的必要。浪费内存。
还有merge是将两个表的内容拼接起来,如 dt1 有id,name 两列, dt2有id age 两列。 效果如下
id name id age
1 a
1 18
不会拼接到同一行。
如果想拼接到同一行,请用如下方法:
private DataTable UniteDataTable(DataTable dt1, DataTable dt2, string DTName) { DataTable dt3 = dt1.Clone(); for (int i = 0; i < dt2.Columns.Count; i++) { dt3.Columns.Add(dt2.Columns[i].ColumnName); } object[] obj = new object[dt3.Columns.Count]; for (int i = 0; i < dt1.Rows.Count; i++) { dt1.Rows[i].ItemArray.CopyTo(obj, 0); dt3.Rows.Add(obj); } if (dt1.Rows.Count >= dt2.Rows.Count) { for (int i = 0; i < dt2.Rows.Count; i++) { for (int j = 0; j < dt2.Columns.Count; j++) { dt3.Rows[i][j + dt1.Columns.Count] = dt2.Rows[i][j].ToString(); } } } else { DataRow dr3; for (int i = 0; i < dt2.Rows.Count - dt1.Rows.Count; i++) { dr3 = dt3.NewRow(); dt3.Rows.Add(dr3); } for (int i = 0; i < dt2.Rows.Count; i++) { for (int j = 0; j < dt2.Columns.Count; j++) { dt3.Rows[i][j + dt1.Columns.Count] = dt2.Rows[i][j].ToString(); } } } dt3.TableName = DTName; //设置DT的名字 return dt3; }
这个方法有个缺点,就是列不能相同。如两个datatable,id列名不能重复。效果如下
id name id2 age
1 a 1 18
——————————————————————无奈的分割线————————
如果两个表不是datatable,而是数据库中的两个表。有个好点的方法,就是用sql全链接 full join 。条件on 表1.id=表2.id。也可以达到拼接的效果,不过我没实验是否满足你的需求,因为我电脑没有安装数据库....
希望对你有点帮助。