2010-11-15 11 views
6

Come posso copiare 1 colonna di dati da 1 tabella di dati in un nuovo datatable. Quando provo a farlo, ottengo l'errore "XXX" colonna appartiene già a un altro DataTable.?Impossibile copiare datacolumn da una tabella di dati ad un altro

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

Grazie in anticipo

+1

Se pubblichi codice o XML, si prega di ** ** evidenziare quelle righe nell'editor di testo e fare clic sul pulsante "codice" (101 010) nella barra degli strumenti Editor per formattare bene e sintassi evidenziarlo! –

+0

possibile duplicato di [Come possiamo copiare i dati della colonna dati del datatable in un altro datatable?] (Http://stackoverflow.com/questions/2583898/how-can-we-copy-the-data-of-the -datacolumn-of-the-datatable-to-another-datatable) –

risposta

7

Non è possibile copiare DataColumns. Quello che devi fare è creare una nuova DataColumn nel nuovo datatable con lo stesso tipo di dati della colonna del vecchio datatable, e quindi devi eseguire un ciclo FOR per portare tutti i dati dal vecchio datatable al nuovo tabella dati.

Vedere il seguente codice. Ciò presuppone che i datatables abbiano esattamente lo stesso numero di righe.

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

Inoltre, se i dati che si sta copiando sono tipi di riferimento e non i tipi di valore si potrebbe desiderare di vedere se un metodo di .Clone() è disponibile per il tipo, o fare uno voi stessi. Il solo fare "this = that" nel ciclo FOR non funzionerà sui tipi di riferimento.

+0

@Lane Grazie..Ma penso che questo approccio sarà molto costoso come Potrei dover copiare più di 1 colonna e le righe possono superare 1 milione .. – Ananth

+1

È possibile copiare i dati in più colonne nello stesso ciclo. Questo è l'unico modo per farlo. – SLaks

+0

concordato. Questo è l'unico modo per farlo, se si sta copiando una colonna da un datatable ad un altro datatable. Potrebbe non essere costoso come pensi. Provalo e vedi – Lane

4

Non è possibile copiare un DataColumn. (Le colonne dati sono strettamente collegate alle loro tabelle)

Invece, è possibile aggiungere una nuova colonna con lo stesso nome e tipo di dati.

Si potrebbe cercare DataTable.Clone(), che creerà una copia strutturata di un'intera tabella. (Con lo stesso schema, ma senza dati)

+0

Grazie..Ma ho bisogno di avere i dati anche nella nuova tabella dati .. – Ananth

1

Solo un pensiero, i tuoi DataTable sono entrambi nello stesso DataSet?

In tal caso, è possibile creare un nome DataRelation tra le colonne di due tabelle (si pensi alla chiave esterna).

Quindi è possibile aggiungere una DataColumn calcolata alla tabella che ha la proprietà Expression impostata su "Figlio (NomeCondazione) .ColumnName" o "Parent (NomeCondazione) .ColumnName" a seconda della direzione della relazione.

Questo ti darà lo stesso effetto della copia della colonna, ma credo che la valuti solo pigramente. Quindi forse ti darà quello che ti serve.

C'è un esempio here di come funziona. L'esempio utilizza la funzione di aggregazione Sum, ma basta fare riferimento al nome della colonna e si duplicarlo nel vostro 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

Sono abbastanza sicuro che non valuterà pigramente. Inoltre, i valori nelle colonne saranno permanentemente collegati, il che può o non può essere quello che vuole. – SLaks

+0

@SLaks - Hai ragione riguardo al collegamento: può essere buono o cattivo a seconda delle tue esigenze. Il motivo per cui penso sia pigro è a causa del collegamento. Immagino che internamente sia solo un delegato che si lega ai dati nella tabella originale, quindi non avviene realmente la copia. Mi piacerebbe sapere se ho torto perché non ho mai provato questo ... – sheikhjabootie

+0

Grazie .. Ma i miei DataTables entrambi nello stesso DataSet. – Ananth

-2

No looping necessario, consultare questo, spero che questo dovrebbe risolvere il tuo 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

La creazione di un nuovo DataTable non è ciò che è stato chiesto in questa domanda. (Inoltre, la seconda chiamata del costruttore è superflua.) –

0

il problema è causato dal C# non può riutilizzare l'istanza dell'oggetto creato e lo utilizza su multipli DataTable. Per questo è necessario creare un nuovo oggetto DataCollumn per ogni iterazione del ciclo.

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

Spero sia di aiuto ...

0

Ho usato il seguente per unire due tabelle utilizzando principalmente LINQ e solo il looping attraverso le righe alla fine. Non lo chiamerei carino ma funziona. Utilizzando il join per evitare alcune delle ipotesi sopra elencate.

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

Non penso che vogliano unire una tabella con un'altra, sembra che vogliano semplicemente seminare una tabella con una sola colonna dalla prima. – Jesse

Problemi correlati