如何根据条件合并两个包含不同列的数据表?
问题描述:
我有两个数据表中,首先包含如何根据条件合并两个包含不同列的数据表?
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"
,并配备额外的列,
我想合并这两个表中,如果第一TABEL的MaterialNo是相同的用第二个表的MaterialNo列,然后从第二个表中取出公共列字段值来更新第一个值对应列的值。 else在第一个表中插入一个新行,使用表的第一列,但是从第二个表中取值。
答
使用此一个以提取新的数据表仅包含差异http://kodesharp.blogspot.com/2007/12/c-compare-2-datatables-and-return-3rd.html
然后使用
foreach
或for
循环到differenes手动提取成阵列。然后把它repumped到数据表
事情是这样的:
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();
}