2010-11-15 26 views
6

¿Cómo puedo copiar 1 columna de datos de 1 tabla de datos a una nueva tabla de datos? Cuando trato de hacerlo, obtengo el error. La columna "XXX" ya pertenece a otra DataTable.No se puede copiar la columna de datos de una tabla de datos a otra

dataColumn = datatable1.Columns[1]; 
datatable2 = new DataTable(); 
datatable2.Columns.Add(dataColumn); 

Gracias de antemano

+1

Si publica código o XML, por favor ** ** destacar aquellas líneas en el editor de texto y haga clic en el botón "código" (101 010) en la barra de herramientas del editor para dar formato y la sintaxis muy bien resaltarlo! –

+0

posible duplicado de [¿Cómo podemos copiar los datos de la columna de datos de la tabla de datos a otra tabla de datos?] (Http://stackoverflow.com/questions/2583898/how-can-we-copy-the-data-of-the -datacolumn-of-the-datatable-to-another-datatable) –

Respuesta

7

No puede copiar DataColumns. Lo que tendrá que hacer es crear una nueva DataColumn en la nueva tabla de datos con el mismo tipo de datos que en la columna de la tabla de datos anterior, y luego debe ejecutar un ciclo FOR para traer todos los datos de la tabla de datos anterior a la nueva tabla de datos.

Vea el siguiente código. Esto supone que las tablas de datos tienen exactamente el mismo número de filas.

 
DataTable dt1 = new DataTable(); 
DataTable dt2 = new DataTable(); 

dt2.Columns.Add("ColumnA", dt1.Columns["ColumnA"].DataType); 

for (int i = 0; i < dt1.Rows.Count; i++) 
{ 
    dt2.Rows[i]["ColumnA"] = dt1.Rows[i]["ColumnA"]; 
}

Además, si los datos que se está copiando son los tipos de referencia y no los tipos de valor es posible que desee para ver si un método .Clone() está disponible para el tipo, o hacer uno mismo. Solo hacer 'this = that' en el ciclo FOR no funcionará en los tipos de referencia.

+0

@Lane Gracias ... Pero creo que este enfoque será muy caro ya que Puede que tenga que copiar más de 1 columna y las filas pueden superar 1 millón. – Ananth

+1

Puede copiar datos en varias columnas en el mismo ciclo. Esta es la única forma de hacerlo. – SLaks

+0

De acuerdo. Esta es la única forma de hacerlo, si está copiando una columna de una tabla de datos a otra tabla de datos. Puede que no sea tan caro como piensas. Pruébelo y vea. – Lane

4

no se puede copiar un DataColumn. (Las columnas de datos están muy juntas con sus tablas)

En su lugar, puede agregar una nueva columna con el mismo nombre y tipo de datos.

Quizás esté buscando DataTable.Clone(), que creará una copia estructural de una tabla completa. (Con el mismo esquema, pero sin datos)

+0

Gracias ... Pero necesito tener los datos también en la nueva tabla de datos ... – Ananth

1

Solo un pensamiento, ¿sus DataTables están en el mismo DataSet?

Si es así, puede crear un nombre DataRelation entre las columnas de dos tablas (piense en una clave foránea).

A continuación, puede agregar una columna de datos calculada a su tabla que tenga su propiedad Expression establecida en "Niño (NombreRelación) .nombreColumna" o "Padre (NombreRelación) .nombreColumna" según la dirección de la relación.

Esto le dará el mismo efecto que copiar la columna, pero creo que solo la evalúa con pereza. Entonces tal vez te dará lo que necesitas.

Hay un ejemplo here de cómo funciona esto. El ejemplo se utiliza la función de agregado Suma, pero sólo tiene que hacer referencia al nombre de la columna y se duplicará en su DataTable

myDataSet.Relations.Add(
    "Orders2OrderLines", 
    myDataSet.Tables["Orders"].Columns["OrderID"], 
    myDataSet.Tables["OrderLines"].Columns["OrderID"]); 

ordersTable.Columns.Add("OrderTotal", typeof(decimal), "Sum(Child(Orders2OrderLines).ExtendedPrice)"); 

HTH

+0

Estoy bastante seguro de que no se evaluará con pereza. Además, los valores en las columnas estarán vinculados permanentemente, lo que puede o no ser lo que él quiere. – SLaks

+0

@SLaks - Tiene razón sobre la vinculación: puede ser bueno o malo dependiendo de sus necesidades. La razón por la que creo que es flojo es debido a la vinculación. Me imagino que internamente es solo un delegado que se une a los datos en la tabla original, por lo que no se produce una copia realmente. Me encantaría saber si me equivoqué, ya que nunca lo he probado ... – sheikhjabootie

+0

Gracias ... Pero mis DataTables están en el mismo DataSet. – Ananth

-2

sin loop necesario, consulte este, espero que esto debería resolver su problema ...

DataTable dt = new DataTable(); 
//fill the dt here 
DataTable dt2 = new DataTable(); 
string[] strCols = {"Column Name to copy"}; 
dt2 = dt.DefaultView.ToTable("newTableName", false, strCols); 
+0

Crear una nueva DataTable no es lo que se preguntó en esta pregunta. (Además, la segunda llamada al constructor es superflua.) –

0

el problema es causado por el C# no se puede volver a utilizar la instancia de objeto creado y lo utiliza en múltiples tablas de datos. Para esto, es necesario crear un nuevo objeto DataCollumn para cada iteración de bucle.

foreach (DataTable table in DATASET.Tables) 
{ 
    DataColumn yourDataCollumn = new DataColumn("Name of DataCollumn", typeof(Your data type)); 
    // your logic here 
} 

Hope it's help ...

0

Utilicé lo siguiente para unir dos tablas utilizando principalmente LINQ y solo recorriendo las filas al final. Yo no lo llamaría bonito, pero funciona. Usar la combinación para evitar algunas de las suposiciones enumeradas anteriormente.

DataTable tableOne = getTableOne(); 
DataTable tableTwo = getTableTwo(); 

var oneColumns = tableOne.Columns.Cast<DataColumn>() 
           .Select(p => new Column(p.ColumnName, DataType)) 
           .ToArray(); 

var twoColumns = tableTwo.Columns.Cast<DataColumn>() 
           .Select(p => new DataColumn(p.ColumnName, p.DataType)) 
           .ToArray(); 


var matches = (from a in tableOne.AsEnumerable() 
       join b in tableTwo.AsEnumerable() on a["column_name"] equals b["column_name"] 
       select a.ItemArray.Concat(b.ItemArray)).ToArray(); 


DataTable merged = new DataTable(); 
merged.Columns.AddRange(oneColumns); 
merged.Columns.AddRange(twoColumns); 

foreach (var m in matches) { merged.Rows.Add(m.ToArray()); } 
+0

No creo que quieran combinar una tabla con otra, parece que solo quieren sembrar una tabla con solo una columna desde el principio. – Jesse

Cuestiones relacionadas