2012-07-19 8 views
5

Verileri dataColumn adresinden, dataTable benim belirli bir sütuna taşımak istiyorum. Datatable içinde hangi sütunun datacolumn eklemek istediğimi nasıl belirleyeceğimi bilmiyorum.DataColumn DataTable'a Ekleme

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

Sana atılacaktır birden fazla DataTable ArgumentException aynı sütun ekleyerek eğer bu, normal bir davranıştır bir istisna Column 'X' already belongs to another DataTable.

+0

sadece ya hareket (aynı ad ve tip bir sütun anlamında) _column_ eklemek isteyen misiniz: Ben, ancak, yeni tabloya tüm sütunları kopyalama değilse bazı hata kontrol öneriyoruz bir tablodan diğerine _data_? –

+0

Verileri bir tablodan diğerine taşıyın. –

cevap

14

Sen ColumnName gibi özelliklerini kopyalayıp yeni DataColumns oluşturmanız gerekir. DataTable, sütunlarına bir reference tuttuğundan ve her sütunun bir DataTable için bir reference tutmasından dolayı izin vermek çok tehlikeli olur. Başka bir tabloya sütun eklerseniz kodunuz er ya da geç erirdi.

da yeni tabloya DataRows kopyalamak istiyorsanız

:

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

Böylece sütun adı ve veri türünü çoğaltır. Verileri col'dan veri tabanına nasıl çıkarırım? –

+0

Peki asıl sorunun nedir? Bir DataTable'ın şemasını kopyalamak mı yoksa (ayrıca) tüm DataRows'ları kopyalamak mı istiyorsunuz? –

+0

Tüm verileri ayrı bir veri tablosuna kopyalayın. Verileri kopyaladığım sütunları belirtmek istiyorum. –

0

alırlar. Burada

bkz belgeleri: http://msdn.microsoft.com/en-us/library/55b10992.aspx

zaten orijinal tabloya eklenen aynı yeni bir sütun oluşturun ve yeni tabloya ekleyebilirsiniz. ArgumentException için bir sebep Zaten başka DataTable'a ait bir DataColumn eklemek var

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

:

0

Tablo veriler daha sonra sütuna göre, sıranın tarafından organize edilmektedir. Tek çekimde bir veri sütunu ekleyemezsiniz. İkinci tabloya tanım sütununu eklemeniz ve verileri ayrı olarak eklemeniz gerekir. Orijinal kod tüm sütunlara döngülendirilen yana

, sen DataTable.Copy() kullanarak özgün datatable kopyalama ve istemiyorum neler silme daha iyi olabilir.

3

Başka bir tablodan bir DataColumn ekleyemezsiniz, çünkü özgün bir tabloyla zaten bir ilişkilendirmesi vardır ve DataColumn bir Object olduğundan, Add yöntemine başvurularak geçirilir. Kopyalamanız gerekecek. adıyla tek tek sütunları Kopya için kullanılabilecek bir uzantısı yöntemi, yani tableA.CopyColumnTo("Column1", tableB); da olduğu

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); 
     } 
    } 
} 

Not: Burada bunu yapabilir bir yolu.

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

Veya Tim SCHMELTER yanıtında kodunun ikinci parçasına benzer bir şekilde

Değilse: yeni tablo özgün bir kopyasını ise

Sonra bu gibi verileri kopyalayabilirsiniz Tam bir kopya.

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