У меня есть две таблицы, которые я хочу «соединить» вместе. В первом есть все столбцы, что и во втором, но данные неполные. У обеих таблиц есть идентификатор, который я буду использовать, чтобы сшить их вместе. Слияние не работает, так как во второй таблице больше строк и она содержит одинаковые идентификаторы в разное время.
Этот пример пояснит это лучше:
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. Я просмотрел несколько связанных вопросов, и ни один из ответов не решает мою проблему. Я не могу заменить ImportRow() на Add(), так как это другой DataTable. OldTable1 и newTable имеют одинаковые столбцы, потому что я создал newTable, клонируя схему из OldTable1. Что мне здесь не хватает?
РЕШЕНИЕ:
Как правильно указал 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);
}
}
}
newTable.ImportRow(newRow);
наnewTable.Rows.Add(newRow);
, и это дает мне следующую ошибку: В System.Data.dll произошло необработанное исключение типа «System.ArgumentException». Дополнительная информация: эта строка уже принадлежит другой таблице. Я мог бы решите это по-другому, как вы можете видеть в моем редактировании, хотя 14.12.2016