2010-11-15 5 views
6

Wie kann ich 1 Datenspalte von einer Datentabelle in eine neue Datentabelle kopieren? Wenn ich es versuche, bekomme ich den Fehler Spalte 'XXX' gehört bereits zu einem anderen DataTable.Kopieren der Datenspalte von einer Datentabelle in eine andere nicht möglich

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

Vielen Dank im Voraus

+1

Wenn Sie Code oder XML zu veröffentlichen, ** bitte diese Zeilen im Texteditor und klicken Sie auf den „Code“ Taste (101 010) auf der Editor-Symbolleiste schön zu formatieren und Syntax markieren Sie ** markieren! –

+0

mögliches Duplikat von [Wie können wir die Daten der Datensäule der Datentabelle in eine andere Datentabelle kopieren?] (Http://stackoverflow.com/questions/2583898/how-can-we-copy-the-data-of-the -datacolumn-of-the-datatable-to-another-datable) –

Antwort

7

Sie können DataColumns nicht kopieren. Was Sie tun müssen, ist eine neue DataColumn in der neuen Datentabelle mit dem gleichen Datentyp wie in der Spalte der alten Datentabelle zu erstellen, und dann müssen Sie eine FOR-Schleife ausführen, um alle Daten von der alten Datentabelle in die neue zu bringen Datentabelle.

Siehe den folgenden Code. Dies setzt voraus, dass die Databases genau die gleiche Anzahl von Zeilen haben.

 
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"]; 
}

Auch, wenn die Daten, die Sie Referenztypen kopieren sind und nicht die Werttypen Sie Methode könnte wollen, um zu sehen, ob ein .Clone() für den Typ verfügbar ist, oder selbst eine Beurteilung machen. Das Ausführen von 'this = that' in der FOR-Schleife funktioniert nicht bei Referenztypen.

+0

@Lane Danke..Aber ich denke, dass dieser Ansatz wird sehr teuer sein als Ich muss möglicherweise mehr als 1 Spalte kopieren und Zeilen können 1 Million überschreiten. – Ananth

+1

Sie können Daten in mehreren Spalten in der gleichen Schleife kopieren. Dies ist der einzige Weg, dies zu tun. – SLaks

+0

Einverstanden. Dies ist die einzige Möglichkeit, wenn Sie eine Spalte von einer Datentabelle in eine andere Datentabelle kopieren. Es ist vielleicht nicht so teuer wie Sie denken. Probieren Sie es aus und sehen Sie. – Lane

4

Sie keine Datacolumn kopieren. (DataColumns sind sehr eng mit ihren Tabellen verbunden)

Stattdessen können Sie eine neue Spalte mit demselben Namen und Datentyp hinzufügen.

Sie suchen möglicherweise nach DataTable.Clone(), die eine strukturelle Kopie einer gesamten Tabelle erstellen wird. (Mit demselben Schema, aber keine Daten)

+0

Danke..Aber ich brauche die Daten auch in der neuen Datentabelle .. – Ananth

1

Nur ein Gedanke, sind Ihre DataTables beide im selben DataSet?

Wenn ja, können Sie einen Namen DataRelation zwischen den Spalten von zwei Tabellen erstellen (think Fremdschlüssel).

Dann können Sie eine Calculated DataColumn Ihrer Tabelle hinzufügen, deren Expression -Eigenschaft abhängig von der Richtung der Beziehung auf "Child (RelationName) .ColumnName" oder "Parent (RelationName) .ColumnName" gesetzt ist.

Dies wird Ihnen den gleichen Effekt wie das Kopieren der Spalte geben, aber ich glaube, es bewertet es nur träge. Vielleicht gibt es dir das, was du brauchst.

Es gibt ein Beispiel here wie das funktioniert. Das Beispiel verwendet die Summe Aggregatfunktion, aber Sie müssen nur die Spaltennamen verweisen, und es wird es in Ihrem Datatable doppelte

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

Ich bin mir ziemlich sicher, dass es nicht faul bewerten wird. Außerdem werden die Werte in den Spalten dauerhaft verknüpft, was sein kann oder nicht. – SLaks

+0

@SLaks - Sie haben Recht mit der Verknüpfung - es kann gut oder schlecht sein, je nach Ihren Bedürfnissen. Der Grund, warum ich denke, dass es faul ist, liegt an der Verbindung. Ich stelle mir vor, dass intern nur ein Delegat an die Daten in der Originaltabelle bindet - also findet kein Kopieren statt. Ich würde gerne wissen, ob ich falsch lag, da ich das noch nie getestet habe ... – sheikhjabootie

+0

Danke .. Aber meine DataTables sind beide im selben DataSet. – Ananth

-2

Kein Looping erforderlich, siehe diese Hoffnung sollte lösen Ihr Problem ...

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

Erstellen einer neuen DataTable wurde nicht in dieser Frage gefragt. (Auch der Aufruf des zweiten Konstruktors ist überflüssig.) –

0

das Problem wird durch die C# verursacht wird, kann die Objektinstanz erstellt nicht wiederverwendet werden und verwendet sie auf ein Vielfaches Tables. Dazu muss für jede Schleifeniteration ein neues Objekt DataCollumn angelegt werden.

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

Ich hoffe, es hilft ...

0

Ich verwendete die unten, um zwei Tabellen mit hauptsächlich LINQ und nur durch die Zeilen am Ende durchschleifen. Ich würde es nicht schön nennen, aber es funktioniert. Verwenden Sie den Join, um einige der oben aufgeführten Annahmen zu vermeiden.

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

Ich glaube nicht, dass sie eine Tabelle mit einer anderen zusammenführen wollen, es klingt so, als wollten sie nur eine Tabelle mit nur einer Spalte von der ersten seedieren. – Jesse

Verwandte Themen