首页 新闻 会员 周边

merge的用法

0
悬赏园豆:15 [已解决问题] 解决于 2013-10-20 20:54

第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是第一张表的外键,是否能合并?合并的原理大致是什么呢?

求解

雾里小梅花的主页 雾里小梅花 | 初学一级 | 园豆:137
提问于:2013-10-11 22:37
< >
分享
最佳答案
1

按照你贴的代码,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。也可以达到拼接的效果,不过我没实验是否满足你的需求,因为我电脑没有安装数据库....

 

希望对你有点帮助。

收获园豆:15
何以解忧唯有撸码 | 初学一级 |园豆:37 | 2013-10-13 11:15
其他回答(1)
0
iEvent | 园豆:529 (小虾三级) | 2013-10-12 10:06
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册