2012-07-19 11 views
5

Chcę przenieść dane z dataColumn do konkretnej kolumny w moim dataTable. Nie jestem pewien, jak określić kolumnę w moim Datatable Chcę dodać datacolumn.Dodawanie DataColumn do DataTable

 foreach (DataColumn col in dt.Columns) 
     { 
      dt1.Columns.Add(col); 
     } 

Otrzymuję wyjątek Column 'X' already belongs to another DataTable.

+0

Są po prostu chcąc dodać _column_ (czyli kolumny o tej samej nazwie i rodzaj) lub przenieść the_data_ od jednej tabeli do drugiej? –

+0

Przenieś dane z jednej tabeli do drugiej. –

Odpowiedz

14

Trzeba skopiować właściwości jak ColumnName i utworzyć nowy DataColumns:

foreach (DataColumn col in dt.Columns) 
{ 
    dt1.Columns.Add(col.ColumnName, col.DataType); 
} 

Jest powód dla ArgumentException podczas dodawania DataColumn który należy już do innej DataTable. Byłoby bardzo niebezpiecznie pozwolić na to, ponieważ DataTable posiada reference do swoich kolumn, a każda kolumna posiada reference do swojej DataTable. Jeśli dodasz kolumnę do innej tabeli, Twój kod zostanie zniszczony prędzej czy później.

Jeśli chcesz także skopiować DataRows do nowej tabeli:

foreach (DataRow row in t1.Rows) 
{ 
    var r = t2.Rows.Add(); 
    foreach (DataColumn col in t2.Columns) 
    { 
     r[col.ColumnName] = row[col.ColumnName]; 
    } 
} 
+0

Tak, aby replikować nazwę kolumny i typ danych. Jak wyodrębnić dane z col do datatable? –

+0

Jakie jest Twoje prawdziwe pytanie? Czy chcesz skopiować schemat tabeli DataTable, czy też chcesz skopiować (również) wszystkie 'DataRows'? –

+0

Skopiuj wszystkie dane do osobnej tabeli danych. Chcę móc określić, do których kolumn kopiuję dane. –

0

jest to normalne zachowanie, jeśli dodajesz taką samą kolumnę do więcej niż jednej DataTable ArgumentException zostanie wyrzucony.

zobacz dokumentację tutaj: http://msdn.microsoft.com/en-us/library/55b10992.aspx

można utworzyć nową kolumnę taką samą jak ta, którą już dodana do oryginalnej tabeli i dodać go do nowej tabeli.

0

dane Tabela organizowana jest przez rząd, a następnie przez kolumnę. Nie możesz (o czym wiem) dodać kolumny danych w jednym ujęciu. Będziesz musiał dodać kolumnę definicji do drugiej tabeli i dodać dane do niej osobno.

Ponieważ oryginalny kod zapętlony przez wszystkie kolumny, może być lepiej kopiowanie oryginału DataTable przy użyciu DataTable.Copy() i usuwanie co ty nie chcą.

3

Nie można dodać kolumny DataColumn z innej tabeli, ponieważ ma ona już powiązanie z oryginalną tabelą, a kolumna DataColumn jest przekazywana przez odwołanie do metody Add, ponieważ jest to obiekt. Musisz go skopiować. Oto jeden ze sposobów można to zrobić:

public static class DataColumnExtensions 
{ 
    public static DataColumn CopyTo(this DataColumn column, DataTable table) 
    { 
     DataColumn newColumn = new DataColumn(column.ColumnName, column.DataType, column.Expression, column.ColumnMapping); 
     newColumn.AllowDBNull = column.AllowDBNull; 
     newColumn.AutoIncrement = column.AutoIncrement; 
     newColumn.AutoIncrementSeed = column.AutoIncrementSeed; 
     newColumn.AutoIncrementStep = column.AutoIncrementStep; 
     newColumn.Caption = column.Caption; 
     newColumn.DateTimeMode = column.DateTimeMode; 
     newColumn.DefaultValue = column.DefaultValue; 
     newColumn.MaxLength = column.MaxLength; 
     newColumn.ReadOnly = column.ReadOnly; 
     newColumn.Unique = column.Unique; 

     table.Columns.Add(newColumn); 

     return newColumn; 
    } 

    public static DataColumn CopyColumnTo(this DataTable sourceTable, string columnName, DataTable destinationTable) 
    { 
     if (sourceTable.Columns.Contains(columnName)) 
     { 
      return sourceTable.Columns[columnName].CopyTo(destinationTable); 
     } 
     else 
     { 
      throw new ArgumentException("The specified column does not exist", "columnName"); 
     } 
    } 
} 

public class MyClass 
{ 
    public static void Main() 
    { 
     DataTable tableA = new DataTable("TableA"); 
     tableA.Columns.Add("Column1", typeof(int)); 
     tableA.Columns.Add("Column2", typeof(string)); 

     DataTable tableB = new DataTable("TableB"); 

     foreach (DataColumn column in tableA.Columns) 
     { 
      column.CopyTo(tableB); 
     } 
    } 
} 

Należy pamiętać, że istnieje również metodę rozszerzenia, które mogą być wykorzystywane do kopiowania poszczególnych kolumn według nazwy, tj tableA.CopyColumnTo("Column1", tableB);.

Następnie można skopiować dane tak, jeśli nowa tabela jest dokładną kopią oryginału:

foreach (DataRow row in tableA.Rows) 
{ 
    tableB.Rows.Add(row.ItemArray); 
} 

Albo w sposób podobny do drugiego kawałka kodu w odpowiedzi Tim Schmelter, jeśli nie jest to dokładną kopię. Chciałbym jednak, polecam sprawdzenie jakiś błąd, jeśli nie są kopiowane wszystkie kolumny do nowej tabeli:

foreach (DataRow souceRow in sourceTable.Rows) 
{ 
    DataRow destinationRow = destinationTable.Rows.Add(); 

    foreach (DataColumn destinationColumn in destinationTable.Columns) 
    { 
     string columnName = destinationColumn.ColumnName; 

     if (sourceTable.Columns.Contains(columnName)) 
     { 
      destinationRow[columnName] = sourceRow[columnName]; 
     } 
    } 
}