Copiar linhas de um Datatable para outro DataTable?

165

Como posso copiar linhas específicas do DataTable para outro Datable em c #? Haverá mais de uma linha.

kartal
fonte

Respostas:

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

O exemplo acima assume que dataTable1e dataTable2tem o mesmo número, tipo e ordem de colunas.

Bradley Smith
fonte
22
Isso não resultaria em "Esta linha já pertence a outra tabela".
21312 McArthey
15
@McArthey Não, não seria; uma nova linha está sendo criada a partir dos valores na linha existente. A linha em si não está sendo adicionada à outra DataTable.
amigos estão dizendo sobre bradley smith
20
@DawoodAbbasi Isso só aconteceria se você deixasse de fora a ItemArrayparte no final da expressão. Certifique-se de adicionar os valores da linha, não a própria linha.
Bradley Smith
4
@DawoodAbbasi Consulte a documentação do MSDN para o DataTable.Clonemétodo: msdn.microsoft.com/en-us/library/...
Bradley Smith
10
Embora sua resposta tecnicamente esteja correta, seu exemplo de código não aborda suas suposições. A resposta do @RageeshGr lida com todas as suposições e o IMHO é escrito de forma mais concisa e menos propenso a erros.
chris.nesbit1
94

Copiar linhas especificadas da tabela para outra

// 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);
   }
}
Rageesh Geetha Raman
fonte
Se não precisar mais usar o dttableOld após a importação, ainda preciso usar o Clone ()?
27419 Sam
Ótimo e prático! Obrigado!
Mayer Spitzer
1
@ Sam em relação à sua pergunta, Clone é copiar a estrutura da tabela, se a sua tabela já tiver o mesmo tipo de dados, você não precisará dela.
Mayer Spitzer
19

Tente isto

    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);
    }
Zia
fonte
@ManojSavalia, então qual é a alternativa que não custa desempenho?
Sam
16

Verifique isso, você pode gostar (anteriormente, por favor, clone a tabela1 para a tabela2):

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

Ou:

table1.AsEnumerable().Where ( yourcondition  ) .CopyToDataTable(table2,LoadOption.OverwriteChanges);
Estevez
fonte
Essa é uma abordagem muito melhor porque usa o recurso interno para copiar ou selecionar linhas de um DataTable para outro sem iterar explicitamente em cada um, diferente de todo o loop foreach, respostas baseadas no método .ForEach.
David Burg
15

Com suporte em: 4, 3.5 SP1, agora você pode apenas chamar um método no objeto.

DataTable dataTable2 = dataTable1.Copy()
Amir
fonte
2
Tecnicamente, isso cria uma cópia de uma tabela de dados. Embora não esteja explicitamente declarado na pergunta, é possível que o dataTable2 já exista e tenha outras linhas que não queremos perder. Além disso, a pergunta especifica especificamente "linhas específicas", enquanto isso trata apenas de todas as linhas.
Matt
5

Como resultado das outras postagens, este é o mais curto que pude obter:

DataTable destTable = sourceTable.Clone();
sourceTable.AsEnumerable().Where(row => /* condition */ ).ToList().ForEach(row => destTable.ImportRow(row));
Meiel
fonte
O que é basicamente um foreach. Além disso, você não está filtrando uma condição, conforme solicitado pelo OP.
22816 Eric Wu
Agora, se eu limpar a sourceTablevontade, destTabletambém limpará?
Si8
Quero poder atribuir um valor e limpar a variável original sem limpar o destino.
Si8
2

a amostra abaixo seria a maneira mais rápida de copiar uma linha. cada célula está sendo copiada com base no nome da coluna. caso você não precise de uma célula específica para copiar, tente capturar ou adicionar se. se você copiar mais de uma linha, faça um loop no código abaixo.

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);

conjunto de dados1.Tabelas [1]. Linhas [ 0 ] [i]; altere o índice 0 para o índice de linha especificado ou você pode usar uma variável se for fazer um loop ou se for lógico

Chad Dumagas
fonte
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.
 }
Roopendra
fonte
seu código funciona perfeito para mim, é um código muito simples, graças
Esraa_92
1

Para quem deseja consulta SQL de comando único para isso:

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;

Essa consulta copiará os dados de TABLE001para TABLE002e supomos que as duas colunas tenham nomes de colunas diferentes.

Os nomes das colunas são mapeados individualmente, como:

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

Você também pode especificar a cláusula where, se precisar de alguma condição.

Manisha
fonte
0

Para copiar toda a tabela de dados, faça o seguinte:

DataGridView sourceGrid = this.dataGridView1;
DataGridView targetGrid = this.dataGridView2;
targetGrid.DataSource = sourceGrid.DataSource;
inspiron
fonte
2
a questão é como copiar linhas específicas de uma tabela de dados, não a coisa toda.
jtate
0

Eu criei uma maneira fácil de fazer esse problema

 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);   
 } 
Willie Cheng
fonte