как скопировать только столбцы в DataTable в другой DataTable?
Как скопировать только столбцы в DataTable в другой DataTable?
Ответ 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 в соответствии с вашим условием.:)