我有两张桌子,我希望"加入"一起。第一个列具有第二个列的所有列,但数据不完整。两个表都有一个ID,我将用它们将它们拼接在一起。合并不起作用,因为第二个表有更多行,并且它包含相同ID的不同时间。
这个例子将更好地解释它:
OldTable1:
+----+-------+---------+--------+
| ID | Name | PhoneNr | Address|
+----+-------+---------+--------+
| 1 | Tim | 0 | |
+----+-------+---------+--------+
| 2 | Frank | 0 | |
+----+-------+---------+--------+
OldTable2
+----+---------+--------+
| ID | PhoneNr | Address|
+----+---------+--------+
| 1 | 12345 | Avenue |
+----+---------+--------+
| 1 | 67890 | Street |
+----+---------+--------+
| 2 | 55555 | Alley |
+----+---------+--------+
NewTable:
+----+-------+---------+---------+
| ID | Name | PhoneNr | Address |
+----+-------+---------+---------+
| 1 | Tim | 12345 | Avenue |
+----+-------+---------+---------+
| 1 | Tim | 67890 | Street |
+----+-------+---------+---------+
| 2 | Frank | 55555 | Alley |
+----+-------+---------+---------+
这是我的代码:
DataTable newTable = oldTable1.Clone();
foreach (DataRow drOld1 in oldTable1.Rows)
{
foreach (DataRow drOld2 in oldTable2.Rows)
{
if (drOld1["ID"].Equals(drOld2["ID"]))
{
DataRow newRow = oldTable1.NewRow();
newRow.ItemArray = drOld1.ItemArray.Clone() as object[];
newRow["PhoneNr"] = drOld2["PhoneNr"];
newRow["Address"] = drOld2["Address"];
newTable.ImportRow(newRow);
}
}
}
我不知道出了什么问题。在我使用ImportRow进行操作之前,一切似乎都有效。 newRow包含所有正确的信息,它不会将行添加到newTable。我查看了几个相关的问题,没有一个答案可以解决我的问题。我无法用Add()替换ImportRow(),因为它是另一个DataTable。 OldTable1和newTable具有完全相同的列,因为我从OldTable1创建了newTable克隆方案。我在这里缺少什么?
SOLUTION:
正如aguertin正确指出的那样,它不起作用的原因如下:
方法NewRow()分离将导致ImportRow()的行 要被忽略的方法,也不会抛出任何异常。
我的个人解决方案是使用第一个表的旧行而不是创建一个新行。现在一切都按预期工作了。
DataTable newTable = oldTable1.Clone();
foreach (DataRow drOld1 in oldTable1.Rows)
{
foreach (DataRow drOld2 in oldTable2.Rows)
{
if (drOld1["ID"].Equals(drOld2["ID"]))
{
drOld1["PhoneNr"] = drOld2["PhoneNr"];
drOld1["Address"] = drOld2["Address"];
newTable.ImportRow(drOld1);
}
}
}
答案 0 :(得分:2)
NewRow()方法将该行分离,这将导致ImportRow()方法被忽略,并且不会抛出任何异常。
使用Add()....即使你说不能只创建一个临时字典/表并将值存储在那里。