¿Copiar filas de una tabla de datos a otra tabla de datos?

165

¿Cómo puedo copiar filas específicas de DataTable a otro Datable en c #? Habrá más de una fila.

kartal
fuente

Respuestas:

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

El ejemplo anterior supone que dataTable1y dataTable2tiene el mismo número, tipo y orden de columnas.

Bradley Smith
fuente
22
¿No resultaría esto en "Esta fila ya pertenece a otra tabla"?
McArthey
15
@McArthey No, no lo haría; Se está creando una nueva fila a partir de los valores de la fila existente. La fila en sí no se agrega a la otra DataTable.
Bradley Smith
20
@DawoodAbbasi Eso solo sucedería si omitiera la ItemArrayparte al final de la expresión. Asegúrese de agregar los valores de la fila, no la fila en sí.
Bradley Smith
44
@DawoodAbbasi Consulte la documentación de MSDN para el DataTable.Clonemétodo: msdn.microsoft.com/en-us/library/…
Bradley Smith
10
Aunque su respuesta técnicamente es correcta, su muestra de código no aborda sus suposiciones. La respuesta de @RageeshGr maneja todos los supuestos y, en mi humilde opinión, está escrita de manera más concisa y es menos propensa a errores.
chris.nesbit1
94

Copiar filas especificadas de la tabla a otra

// 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
fuente
Si ya no necesito usar dttableOld después de la importación, ¿debo usar Clone ()?
Sam
¡Genial y práctico! ¡Gracias!
Mayer Spitzer
1
@Sam con respecto a su pregunta, Clone es copiar la estructura de la tabla, si su tabla ya es del mismo tipo de datos, entonces no la necesita.
Mayer Spitzer
19

Prueba esto

    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
fuente
@ManojSavalia, ¿cuál es la alternativa que no cuesta rendimiento?
Sam
16

Mira esto, te puede gustar (anteriormente, por favor, clona la tabla1 a la tabla2):

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

O:

table1.AsEnumerable().Where ( yourcondition  ) .CopyToDataTable(table2,LoadOption.OverwriteChanges);
Estevez
fuente
Este es un enfoque mucho mejor porque utiliza la capacidad incorporada para copiar en rango o incluso seleccionar filas de una tabla de datos a otra sin iterar explícitamente a través de cada una, a diferencia de todo el bucle foreach, respuestas basadas en el método .ForEach.
David Burg
15

Admitido en: 4, 3.5 SP1, ahora solo puede llamar a un método en el objeto.

DataTable dataTable2 = dataTable1.Copy()
Amir
fuente
2
Técnicamente, esto crea una copia de una tabla de datos. Si bien no se menciona explícitamente en la pregunta, es posible que dataTable2 ya exista y tenga otras filas que no queremos perder. Además, la pregunta establece específicamente "filas específicas", mientras que esto solo maneja todas las filas.
Matt
5

Como resultado de las otras publicaciones, esto es lo más corto que pude obtener:

DataTable destTable = sourceTable.Clone();
sourceTable.AsEnumerable().Where(row => /* condition */ ).ToList().ForEach(row => destTable.ImportRow(row));
Meiel
fuente
Que es básicamente un foreach. Además, no está filtrando a través de una condición, según lo solicitado por el OP.
Eric Wu
Ahora, si aclaro, sourceTable¿ destTabletambién se borrará?
Si8
Quiero poder asignar un valor y borrar la variable original sin borrar el destino.
Si8
2

La siguiente muestra sería la forma más rápida de copiar una fila. cada celda se copia en función del nombre de la columna. en caso de que no necesite una celda específica para copiar, intente capturar o agregar if. si va a copiar más de 1 fila, luego repita el código a continuación.

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 datos1. Tablas [1]. Filas [ 0 ] [i]; cambie el índice 0 a su índice de fila especificado o puede usar una variable si va a realizar un bucle o si será lógico

Chad Dumagas
fuente
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
fuente
su código funciona perfecto para mí, es un código muy simple, gracias
Esraa_92
1

Para aquellos que desean una consulta SQL de comando único para eso:

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;

Esta consulta copiar datos de TABLE001a TABLE002y suponemos que las dos columnas tenían diferentes nombres de columna.

Los nombres de columna se asignan uno a uno 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

También puede especificar la cláusula where, si necesita alguna condición.

Manisha
fuente
0

Para copiar toda la tabla de datos, simplemente haga esto:

DataGridView sourceGrid = this.dataGridView1;
DataGridView targetGrid = this.dataGridView2;
targetGrid.DataSource = sourceGrid.DataSource;
inspiron
fuente
2
La pregunta es cómo copiar filas específicas de una tabla de datos, no todo.
jtate
0

He creado una manera fácil de resolver este 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
fuente