2010-06-01 173 views

Respuesta

76

DataTable.Clone() debería hacer el truco.

DataTable newTable = originalTable.Clone(); 
+0

gracias mucho :-) – user354547

+0

¡Estaba buscando este! –

24

Si solo se requieren las columnas, se puede usar DataTable.Clone(). Con la función Clone solo se copiará el esquema. Pero DataTable.Copy() copia tanto la estructura como los datos

P. ej.

DataTable dt = new DataTable(); 
dt.Columns.Add("Column Name"); 
dt.Rows.Add("Column Data"); 
DataTable dt1 = dt.Clone(); 
DataTable dt2 = dt.Copy(); 

dt1 tendrá solamente la columna uno, sino dt2 tendrá una columna con una fila.

+0

¿Acaso Barry ya no dio esta respuesta hace tres horas? –

+0

gracias mucho por la ayuda :-) – user354547

1

DataTable.Clone() El método funciona muy bien cuando se desea crear una nueva DataTable, pero puede haber casos en los que se quieren añadir las columnas de esquema de un DataTable a otro DataTable existente.

Por ejemplo, si ha derivado una nueva subclase de DataTable y desea importar información de esquema en ella, no podría usar Clone().

ej .:

public class CoolNewTable : DataTable { 
    public void FillFromReader(DbDataReader reader) { 
     // We want to get the schema information (i.e. columns) from the 
     // DbDataReader and 
     // import it into *this* DataTable, NOT a new one. 
     DataTable schema = reader.GetSchemaTable(); 
     //GetSchemaTable() returns a DataTable with the columns we want. 

     ImportSchema(this, schema); // <--- how do we do this? 
    } 
} 

La respuesta es sólo para crear nuevos DataColumns en el DataTable existente utilizando columnas de la tabla de esquema como plantillas.

I.e. el código para ImportSchema sería algo como esto:

void ImportSchema(DataTable dest, DataTable source) { 
    foreach(var c in source.Columns) 
     dest.Columns.Add(c); 
} 

o, si está utilizando LINQ:

void ImportSchema(DataTable dest, DataTable source) { 
    var cols = source.Columns.Cast<DataColumn>().ToArray(); 
    dest.Columns.AddRange(cols); 
} 

Esto fue sólo un ejemplo de una situación en la que es posible que desee copiar esquemas/columnas de una DataTable a otra sin usar Clone() para crear una DataTable completamente nueva. Estoy seguro de que he encontrado varios otros también.

+0

si trato de hacer un ciclo como su iteración sugerida que se muestra arriba en 'ImportSchema' - me sale un error diciendo que la columna ya pertenece a otra DataTable. En otras palabras, no puede iterar una colección de columnas de DataTable existente y asignar esas instancias específicas a una instancia diferente de DataTable. – bkwdesign

+0

creo que este podría ser el camino para escribir ms ImportSchema Dim como nuevo IO.MemoryStream srcDataTable.WriteXmlSchema (ms) ms.Seek (0, IO.SeekOrigin.Begin) destDataTable.ReadXmlSchema (ms) – bkwdesign

3

Datatable.Clone es lento para tablas grandes. Actualmente estoy usando esto:

Dim target As DataTable = 
    New DataView(source, "1=2", Nothing, DataViewRowState.CurrentRows) 
    .ToTable() 

Tenga en cuenta que esto solo copia la estructura de la tabla fuente, no los datos.

+1

OP preguntó para la solución de C#. Esto es VB – AaA

0

Si desea copiar el DataTable a otro DataTable de diferentes DataType entonces usted puede hacer esto:

  • En primer lugar clonar el primer DataType de manera que sólo se puede obtener la estructura.
  • A continuación, modifique la estructura recién creada según su necesidad y luego copie los datos a DataTable recién creado.

Así:

Dim dt1 As New DataTable 
dt1 = dtExcelData.Clone() 
dt1.Columns(17).DataType = System.Type.GetType("System.Decimal") 
dt1.Columns(26).DataType = System.Type.GetType("System.Decimal") 
dt1.Columns(30).DataType = System.Type.GetType("System.Decimal") 
dt1.Columns(35).DataType = System.Type.GetType("System.Decimal") 
dt1.Columns(38).DataType = System.Type.GetType("System.Decimal") 
dt1 = dtprevious.Copy() 

De ahí se obtiene el mismo DataTable pero revisó la estructura

0

Si desea que la estructura de una tabla en particular de datos (DataTable1) con títulos de las columnas (sin datos) a otro tabla de datos (dataTable2), puede seguir el siguiente código:

 DataTable dataTable2 = dataTable1.Clone(); 
     dataTable2.Clear(); 

Ahora puede llenar dataTable2 a según su condición. :)