Подтвердить что ты не робот

Как скопировать только столбцы в DataTable в другой DataTable?

как скопировать только столбцы в DataTable в другой DataTable?

4b9b3361

Ответ 1

DataTable.Clone() должен сделать трюк.

DataTable newTable = originalTable.Clone();

Ответ 2

Если требуются только столбцы, то можно использовать DataTable.Clone(). При использовании функции Clone копируется только схема. Но DataTable.Copy() копирует структуру и данные

например.

DataTable dt = new DataTable();
dt.Columns.Add("Column Name");
dt.Rows.Add("Column Data");
DataTable dt1 = dt.Clone();
DataTable dt2 = dt.Copy();

dt1 будет иметь только один столбец, но dt2 будет иметь один столбец с одной строкой.

Ответ 3

Datatable.Clone медленный для больших таблиц. В настоящее время я использую это:

Dim target As DataTable = 
    New DataView(source, "1=2", Nothing, DataViewRowState.CurrentRows)
    .ToTable()

Обратите внимание, что это копирует структуру исходной таблицы, а не данные.

Ответ 4

Метод DataTable.Clone() отлично работает, когда вы хотите создать совершенно новый DataTable, но могут быть случаи, когда вы хотите добавить столбцы схемы из одного DataTable в другой существующий DataTable.

Например, если вы вывели новый подкласс из DataTable и хотите импортировать в него информацию о схеме, вы не сможете использовать Clone().

например:.

public class CoolNewTable : DataTable {
   public void FillFromReader(DbDataReader reader) {
       // We want to get the schema information (i.e. columns) from the 
       // DbDataReader and 
       // import it into *this* DataTable, NOT a new one.
       DataTable schema = reader.GetSchemaTable(); 
       //GetSchemaTable() returns a DataTable with the columns we want.

       ImportSchema(this, schema); // <--- how do we do this?
   }
}

Ответ заключается в том, чтобы создать новые DataColumns в существующем DataTable, используя столбцы таблицы схемы в качестве шаблонов.

т.е. код для ImportSchema будет примерно таким:

void ImportSchema(DataTable dest, DataTable source) {
    foreach(var c in source.Columns)
        dest.Columns.Add(c);
}

или, если вы используете Linq:

void ImportSchema(DataTable dest, DataTable source) {
    var cols = source.Columns.Cast<DataColumn>().ToArray();
    dest.Columns.AddRange(cols);
}

Это был всего лишь один пример ситуации, когда вы захотите скопировать схему/столбцы из одного DataTable в другой, не используя Clone(), чтобы создать совершенно новый DataTable. Я уверен, что столкнулся и с несколькими другими.

Ответ 5

Если вы хотите скопировать DataTable в другой DataTable другого DataType, вы можете сделать это:

  • Сначала Clone первый DataType, чтобы вы могли получить структуру.
  • Затем измените вновь созданную структуру в соответствии с вашими потребностями, а затем скопируйте данные во вновь созданный DataTable ,

Итак:

Dim dt1 As New DataTable
dt1 = dtExcelData.Clone()
dt1.Columns(17).DataType = System.Type.GetType("System.Decimal")
dt1.Columns(26).DataType = System.Type.GetType("System.Decimal")
dt1.Columns(30).DataType = System.Type.GetType("System.Decimal")
dt1.Columns(35).DataType = System.Type.GetType("System.Decimal")
dt1.Columns(38).DataType = System.Type.GetType("System.Decimal")
dt1 = dtprevious.Copy()

Следовательно, вы получаете ту же DataTable, но пересмотренную структуру

Ответ 6

Если вы хотите, чтобы структура конкретной таблицы данных (dataTable1) с заголовками столбцов (без данных) в другую таблицу данных (dataTable2), вы можете следовать приведенному ниже коду:

        DataTable dataTable2 = dataTable1.Clone();
        dataTable2.Clear();

Теперь вы можете заполнить dataTable2 в соответствии с вашим условием.:)