Копировать строки из одной таблицы данных в другую таблицу данных?


165

Как я могу скопировать определенные строки из DataTable в другой Datable в C #? Там будет более одного ряда.

Ответы:


257
foreach (DataRow dr in dataTable1.Rows) {
    if (/* some condition */)
        dataTable2.Rows.Add(dr.ItemArray);
}

В приведенном выше примере предполагается, что dataTable1и dataTable2имеют одинаковое количество, тип и порядок столбцов.


22
Не приведет ли это к «Эта строка уже принадлежит другой таблице».
Макартей

15
@ McArthey Нет, не будет; новая строка создается из значений в существующей строке. Сама строка не добавляется в другую таблицу данных.
Брэдли Смит

20
@DawoodAbbasi Это произойдет, только если вы пропустите ItemArrayчасть в конце выражения. Убедитесь, что вы добавляете значения строки, а не саму строку.
Брэдли Смит

4
@DawoodAbbasi Обратитесь к документации MSDN для DataTable.Cloneметода: msdn.microsoft.com/en-us/library/…
Брэдли Смит

10
Хотя ваш ответ технически правильный, пример кода не соответствует вашим предположениям. Ответ @RageeshGr обрабатывает все предположения, и IMHO написан более кратко и менее подвержен ошибкам.
chris.nesbit1

94

Копировать указанные строки из таблицы в другую

// here dttablenew is a new Table  and dttableOld is table Which having the data 

dttableNew  = dttableOld.Clone();  

foreach (DataRow drtableOld in dttableOld.Rows)
{
   if (/*put some Condition */)
   {
      dtTableNew.ImportRow(drtableOld);
   }
}

Если мне больше не нужно использовать dttableOld после импорта, мне все равно нужно использовать Clone ()?
Сэм

Великолепно и практично! Спасибо!
Майер Спитцер

1
@Sam относительно вашего вопроса, клон должен скопировать структуру таблицы, если ваша таблица уже имеет тот же тип данных, то вам это не нужно.
Майер Спитцер

19

Попробуй это

    String matchString="ID0001"//assuming we have to find rows having key=ID0001
    DataTable dtTarget = new DataTable();
    dtTarget = dtSource.Clone();
    DataRow[] rowsToCopy;
    rowsToCopy = dtSource.Select("key='" + matchString + "'");
    foreach (DataRow temp in rowsToCopy)
    {
        dtTarget.ImportRow(temp);
    }

@ManojSavalia, так какова альтернатива, которая не стоит производительности?
Сэм

16

Проверьте это, вам это может понравиться (ранее, пожалуйста, клонируйте table1 to table2):

table1.AsEnumerable().Take(recodCount).CopyToDataTable(table2,LoadOption.OverwriteChanges);

Или:

table1.AsEnumerable().Where ( yourcondition  ) .CopyToDataTable(table2,LoadOption.OverwriteChanges);

Это гораздо лучший подход, поскольку он использует встроенную возможность для копирования по диапазону или даже выбора строк из одной таблицы данных в другую без явной итерации по каждой, в отличие от всех циклов foreach, ответов на основе метода .ForEach.
Дэвид Бург

15

Поддерживается в: 4, 3.5 SP1, теперь вы можете просто вызвать метод объекта.

DataTable dataTable2 = dataTable1.Copy()

2
Технически это создает копию таблицы данных. Хотя это явно не указано в вопросе, вполне возможно, что dataTable2 уже существует и содержит другие строки, которые мы не хотим терять. Кроме того, в вопросе конкретно указываются «конкретные строки», тогда как это касается только всех строк.
Мэтт

5

В результате других постов, это самое короткое, что я мог получить:

DataTable destTable = sourceTable.Clone();
sourceTable.AsEnumerable().Where(row => /* condition */ ).ToList().ForEach(row => destTable.ImportRow(row));

Который в основном foreach. Кроме того, вы не фильтруете условие, как того требует OP.
Eric Wu

Теперь, если я уберу sourceTableволю, то destTableтоже проясню?
Si8

Я хочу иметь возможность присвоить значение и очистить исходную переменную без очистки места назначения.
Si8

2

Пример ниже будет самый быстрый способ скопировать одну строку. каждая ячейка копируется на основе имени столбца. если вам не нужна определенная ячейка для копирования, попробуйте catch или add if. если вы собираетесь скопировать более 1 строки, выполните цикл ниже.

DataRow dr = dataset1.Tables[0].NewRow();
for (int i = 0; i < dataset1.Tables[1].Columns.Count; i++)
{
    dr[dataset1.Tables[1].Columns[i].ColumnName] = dataset1.Tables[1].Rows[0][i];
}

datasetReport.Tables[0].Rows.Add(dr);

dataset1.Tables [1] .Rows [ 0 ] [i]; измените индекс 0 на указанный вами индекс строки или вы можете использовать переменную, если вы собираетесь зацикливаться или если она будет логической


1
 private void CopyDataTable(DataTable table){
     // Create an object variable for the copy.
     DataTable copyDataTable;
     copyDataTable = table.Copy();
     // Insert code to work with the copy.
 }

Ваш код прекрасно работает для меня, это очень простой код, спасибо
Esraa_92

1

Для тех, кто хочет SQL-запрос одной команды для этого:

INSERT INTO TABLE002 
(COL001_MEM_ID, COL002_MEM_NAME, COL002_MEM_ADD, COL002_CREATE_USER_C, COL002_CREATE_S)
SELECT COL001_MEM_ID, COL001_MEM_NAME, COL001_MEM_ADD, COL001_CREATE_USER_C, COL001_CREATE_S
FROM TABLE001;

Этот запрос будет копировать данные из TABLE001вTABLE002 и мы предполагаем, что оба столбца имели разные имена столбцов.

Имена столбцов отображаются один в один, например:

COL001_MEM_ID -> COL001_MEM_ID

COL001_MEM_NAME -> COL002_MEM_NAME

COL001_MEM_ADD -> COL002_MEM_ADD

COL001_CREATE_USER_C -> COL002_CREATE_USER_C

COL002_CREATE_S -> COL002_CREATE_S

Вы также можете указать, где предложение, если вам нужно какое-то условие.


0

Чтобы скопировать все данные, просто сделайте это:

DataGridView sourceGrid = this.dataGridView1;
DataGridView targetGrid = this.dataGridView2;
targetGrid.DataSource = sourceGrid.DataSource;

2
вопрос в том, как скопировать определенные строки из таблицы данных, а не все.
jtate

0

Я создал простой способ сделать эту проблему

 DataTable newTable = oldtable.Clone();    
 for (int i = 0; i < oldtable.Rows.Count; i++)
 {
   DataRow drNew = newTable.NewRow();    
   drNew.ItemArray = oldtable.Rows[i].ItemArray;    
   newTable.Rows.Add(drNew);   
 } 
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.