日期:2014-05-18  浏览次数:20943 次

DataTable的合并问题
两个结构相同的DataTable,分别为srcTable、newTable,结构中有个id的列(id为表的主键)
我想达到如下功能,不知如何操作,向大家请教,谢谢!
1、newTable中的id值在srcTable中存在,则把newTalble中的此id的其它列更新到srcTalbe对应的列中;
2、newTable中的id值在srcTable中不存在,则把这些列添加到srcTable中。

------解决方案--------------------
用linq可以很方便地实现。
C# code
DataTable1.Cast<DataRow>().Union(DataTable2.Cast<DataRow>()).GroupBy(x => x["id"]).Select(x => x.First()).Except(DataTable1.Cast<DataRow>()).ToList().ForEach(x =>
{
    DataTable1.Rows.Add(x);
});

------解决方案--------------------
[code=c#]
DataTable srcTable = new DataTable();
      srcTable.Columns.Add("id");
      srcTable.Columns.Add("col1");
      srcTable.Columns.Add("col2");

      for (int i = 0; i < 5; i++)
      {
        DataRow dr = srcTable.NewRow();
        dr["id"] = i;
        srcTable.Rows.Add(dr);
      }

      DataTable newTable = new DataTable();
      newTable.Columns.Add("id");
      newTable.Columns.Add("col1");
      newTable.Columns.Add("col2");

      for (int i = 0; i < 15; i++)
      {
        DataRow dr = newTable.NewRow();
        dr["id"] = i;
        dr["col1"] = string.Format("a{0}", i);
        dr["col2"] = string.Format("b{0}", i);
        newTable.Rows.Add(dr);
      }


      foreach (DataRow dr in newTable.Rows)
      {
        DataRow [] drs = srcTable.Select(string.Format("id={0}",dr["id"].ToString()));
        if (drs.Count()==0)
        {
          DataRow newdr = srcTable.NewRow();
          newdr["id"] = dr["id"];
          newdr["col1"] = dr["col2"];
          newdr["col2"] = dr["col2"];
          srcTable.Rows.Add(newdr);
         
        }
        else
        {
          foreach (DataRow item in drs)
          {
            item["col1"] = dr["col1"];
            item["col2"] = dr["col2"];
          }
          srcTable.AcceptChanges();
        }
      }

      //循环srcTable表
      foreach (DataRow item in srcTable.Rows)
      {
        Response.Write(string.Format("id:{0}|col1{1}|col2{2}",item["id"],item["col1"],item["col2"]));
        Response.Write(" <br/>");
      }
[/code]
------解决方案--------------------
探讨
[code=c#]
DataTable srcTable = new DataTable();