【问题标题】:How to merge two datatable containing different column based on condition?如何根据条件合并包含不同列的两个数据表?
【发布时间】:2012-02-24 19:21:26
【问题描述】:

我有两个数据表,第一个包含

 DataTable  dtMaterialStatement = new DataTable();
                    dtMaterialStatement.Columns.Add(new DataColumn("MaterialNo", Type.GetType("System.String")));
                    dtMaterialStatement.Columns.Add(new DataColumn("MaterialId", Type.GetType("System.String")));
                    dtMaterialStatement.Columns.Add(new DataColumn("Qty", Type.GetType("System.Double")));
                    dtMaterialStatement.Columns.Add(new DataColumn("Unit", Type.GetType("System.String")));
                    dtMaterialStatement.Columns.Add(new DataColumn("SinglePrice", Type.GetType("System.Decimal")));
                    dtMaterialStatement.Columns.Add(new DataColumn("PricePerPack", Type.GetType("System.Decimal")));
                    dtMaterialStatement.Columns.Add(new DataColumn("UnitsPerPack", Type.GetType("System.String")));
                    dtMaterialStatement.Columns.Add(new DataColumn("Discount1", Type.GetType("System.Decimal")));
                    dtMaterialStatement.Columns.Add(new DataColumn("Discount2", Type.GetType("System.Decimal")));
                    dtMaterialStatement.Columns.Add(new DataColumn("Discount3", Type.GetType("System.Decimal")));
                    dtMaterialStatement.Columns.Add(new DataColumn("SalesPrice", Type.GetType("System.Decimal")));
                    dtMaterialStatement.Columns.Add(new DataColumn("Exist", Type.GetType("System.Boolean")));

第二个包含:-

"MaterialNo"
  Qty
 "Unit"
 "SinglePrice"
 "PricePerPack"
 "UnitsPerPack"
 "Discount1"
  "Discount2"
 "Discount3"
 "SalesPrice"

还有额外的专栏,

我想合并两个表,如果第一个表的 MaterialNo 与第二个表的 MaterialNo 列相同,则从第二个表中获取公共列字段值来更新第一个值对应列的值。 否则在第一个表中插入一个新行,首先使用表的列,但从第二个表中获取值。

【问题讨论】:

    标签: c# .net c#-4.0 datatable c#-3.0


    【解决方案1】:
    1. 使用这个来提取一个新的数据表,它只包含差异http://kodesharp.blogspot.com/2007/12/c-compare-2-datatables-and-return-3rd.html

    2. 然后使用foreachfor 循环手动将差异提取到数组中。然后将其重新加载到数据表中

    类似这样的:

    DataTable dt = CompareDataTables(dt1, dt2);
    
    ArrayList Errors = new ArrayList();
    
    for (int i = 0; i < d.Columns.Count; i++)
    {
        for (int j = 0; j < d.Rows.Count; j++)
        {
            if (dt1.Rows[j][i].ToString() != dt2.Rows[j][i].ToString())
                {
                    Errors.Add(j);
                    Errors.Add(i);
                    Errors.Add(dt1.Rows[j][i].ToString());
                    Errors.Add(dt2.Rows[j][i].ToString());
                }
         }
     }
    
    DataTable dtFinal = dt;
    
    for (int i = 0; i < Errors.Count; i += 4)
    {
        int ak = Int32.Parse(Errors[i].ToString());
        int bk = Int32.Parse(Errors[i + 1].ToString());
        dtFinal.Rows[ak][bk] = Errors[i + 2].ToString() + "/" + Errors[i + 3].ToString();
    }
    

    【讨论】:

      猜你喜欢
      • 2020-10-20
      • 2019-05-28
      • 1970-01-01
      • 2022-08-19
      • 1970-01-01
      • 2020-10-13
      • 2020-12-21
      • 1970-01-01
      相关资源
      最近更新 更多