Невозможно скопировать столбец данных из одной таблицы данных в другую - PullRequest
9 голосов
/ 15 ноября 2010

Как мне скопировать 1 столбец данных из 1 таблицы данных в новую таблицу данных?Когда я пытаюсь это сделать, я получаю сообщение об ошибке. Столбец «XXX» уже принадлежит другой таблице данных.

dataColumn = datatable1.Columns[1];
datatable2 = new DataTable();
datatable2.Columns.Add(dataColumn);

Заранее спасибо

Ответы [ 6 ]

9 голосов
/ 15 ноября 2010

Вы не можете копировать DataColumns.Вам нужно создать новый DataColumn в новой таблице данных с тем же типом данных, что и в столбце старой таблицы данных, и затем вам нужно запустить цикл FOR, чтобы перенести все данные из старой таблицы данных в новую.datatable.

См. следующий код.Это предполагает, что таблицы данных имеют одинаковое количество строк.

<code>DataTable dt1 = new DataTable();
DataTable dt2 = new DataTable();

dt2.Columns.Add("ColumnA", dt1.Columns["ColumnA"].DataType);

for (int i = 0; i < dt1.Rows.Count; i++)
{
    dt2.Rows[i]["ColumnA"] = dt1.Rows[i]["ColumnA"];
}

Кроме того, если копируемые данные являются ссылочными типами, а не типами значений, вы можете захотеть увидеть, доступен ли метод .Clone () для типаили сделай сам.Простое выполнение «this = that» в цикле FOR не будет работать с ссылочными типами.

4 голосов
/ 15 ноября 2010

Вы не можете скопировать DataColumn.(DataColumns очень тесно связаны со своими таблицами)

Вместо этого вы можете добавить новый столбец с тем же именем и типом данных.

Возможно, вы ищете DataTable.Clone(), который создастСтруктурная копия всей таблицы.(С той же схемой, но без данных)

1 голос
/ 15 ноября 2010

Просто подумайте, ваши DataTables находятся в одном наборе данных?

Если это так, вы можете создать именованное DataRelation между столбцами двух таблиц (представьте внешний ключ).

Затем вы можете добавить в свою таблицу Calculated DataColumn со свойством Выражение , для которого установлено значение «Child (RelationName) .ColumnName» или «Parent (RelationName) .ColumnName» в зависимости от направления взаимосвязи .

Это даст вам тот же эффект, что и копирование столбца, но я полагаю, что оно оценивает его только лениво. Так что, возможно, это даст вам то, что вам нужно.

Вот пример здесь того, как это работает. В примере используется агрегатная функция Sum , но вам просто нужно сослаться на имя столбца, и оно будет дублироваться в вашей DataTable

myDataSet.Relations.Add(
    "Orders2OrderLines", 
    myDataSet.Tables["Orders"].Columns["OrderID"], 
    myDataSet.Tables["OrderLines"].Columns["OrderID"]);

ordersTable.Columns.Add("OrderTotal", typeof(decimal), "Sum(Child(Orders2OrderLines).ExtendedPrice)");

НТН

0 голосов
/ 08 ноября 2013

Я использовал приведенное ниже, чтобы объединить две таблицы, используя в основном LINQ и только циклически перебирая строки в конце. Я бы не назвал это красивым, но это работает. Использование объединения для предотвращения некоторых из перечисленных выше предположений.

DataTable tableOne = getTableOne();
DataTable tableTwo = getTableTwo();

var oneColumns = tableOne.Columns.Cast<DataColumn>()
                                 .Select(p => new Column(p.ColumnName, DataType))
                                 .ToArray();

var twoColumns = tableTwo.Columns.Cast<DataColumn>()
                                 .Select(p => new DataColumn(p.ColumnName, p.DataType))
                                 .ToArray();


var matches = (from a in tableOne.AsEnumerable()
               join b in tableTwo.AsEnumerable() on a["column_name"] equals b["column_name"]
               select a.ItemArray.Concat(b.ItemArray)).ToArray();


DataTable merged = new DataTable();
merged.Columns.AddRange(oneColumns);
merged.Columns.AddRange(twoColumns);

foreach (var m in matches) { merged.Rows.Add(m.ToArray()); }
0 голосов
/ 05 сентября 2013

Проблема вызвана тем, что c # не может повторно использовать созданный экземпляр объекта и использует его в нескольких объектах DataTables.Для этого необходимо создать новый объект DataCollumn для каждой итерации цикла.

foreach (DataTable table in DATASET.Tables)
{
    DataColumn yourDataCollumn = new DataColumn("Name of DataCollumn", typeof(Your data type));
    // your logic here
}

Надеюсь, это поможет ...

0 голосов
/ 22 сентября 2011

Зацикливание не требуется, обратитесь к нему, надеюсь, это решит вашу проблему ...

DataTable dt = new DataTable(); 
//fill the dt here 
DataTable dt2 = new DataTable(); 
string[] strCols = {"Column Name to copy"}; 
dt2 = dt.DefaultView.ToTable("newTableName", false, strCols);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...