Скопіювати рядки з одного Datatable в інший DataTable?


165

Як можна скопіювати конкретні рядки з DataTable в інший Datable в c #? Буде більше одного ряду.

Відповіді:


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

Наведений вище приклад передбачає , що dataTable1і dataTable2має однакове число, тип і порядок стовпців.


22
Це не призведе до "Цей рядок вже належить до іншої таблиці."
МакАртей

15
@McArthey Ні, це не буде; створюється новий рядок зі значень у існуючому рядку. Сам рядок не додається до іншого DataTable.
Бредлі Сміт

20
@DawoodAbbasi Це станеться лише в тому випадку, якщо ви залишили ItemArrayчастину в кінці виразу. Переконайтеся, що ви додаєте значення рядка, а не сам рядок.
Бредлі Сміт

4
@DawoodAbbasi Зверніться до документації MSDN щодо DataTable.Cloneметоду: msdn.microsoft.com/en-us/library/…
Bradley Smith

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 щодо вашого питання, Clone - це скопіювати структуру таблиці, якщо ваша таблиця вже того самого типу даних, то вона вам не потрібна.
Майєр Шпіцер

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

Перевірте це, можливо, вам це сподобається (раніше, будь ласка, клонуйте таблицю1 до таблиці2):

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

Або:

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

Це набагато кращий підхід, оскільки він використовує вбудовану можливість для діапазону копіювання або навіть вибору рядків з одного DataTable в інший без явного повторення через кожну, на відміну від усіх циклів 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));

Що в основному є передвістям. Крім того, ви не фільтруєте через стан, як цього вимагає ОП.
Ерік Ву

Тепер, якщо я розберу sourceTableволю, destTableтакож буде зрозумілою?
Si8

Я хочу мати змогу призначити значення та очистити оригінальну змінну без очищення місця призначення.
Si8

2

нижче зразок був би найшвидшим способом копіювання одного рядка. кожна комірка копіюється на основі імені стовпця. у випадку, якщо вам не потрібна певна комірка для копіювання, тоді спробуйте вловити або додати, якщо. якщо ви збираєтесь скопіювати більше 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);

набір даних1.Таблиці [1]. Рядки [ 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.