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

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.


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

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

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

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

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

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


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

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.


0

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

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

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);   
 } 
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.