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.

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.


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

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

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

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

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

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


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.
 }

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.


0

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

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

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);   
 } 
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.