#ssis #script-task #script-component
#ssis #скрипт-задача #скрипт-компонент
Вопрос:
Я новичок в SSIS, я беру данные из источника Excel. В источнике Excel есть столбцы, подобные A,B,C,D,E,F
. Я создал datatable1
и datatable1 contains columns A,C,D
. Теперь я хочу создать datatable2 из оставшихся столбцов из листа, которые есть not in datatable1
, но это выдает ошибку Collection was modified; enumeration operation may not execute
DataTable datatable1 = new DataTable();
DataTable datatable2 = new DataTable();
DataTable datatable3 = new DataTable();
foreach (DataColumn tw in dataTable2.Columns) <--error shows here
{
if (datatable1.Columns.Contains(tw.ToString()))
{
dataTable2.Columns.Remove(tw);
}
datatable3.merge(datatable2)
}
Комментарии:
1. Основываясь на этом коде, вы ничего не загрузили в таблицы данных.
Ответ №1:
Как указывает ошибка, вы не можете изменить то, что вы перечисляете.
Вместо этого выполните перечисление по основному списку столбцов. Я вызвал свой ref_data
. Для каждого найденного столбца я спрашивал datatable1
, есть ли у него столбец с тем же именем. Если это произошло, я использовал Remove
метод against datatable2
, чтобы удалить столбец из коллекции.
DataTable ref_data = new DataTable();
DataTable datatable1 = new DataTable();
DataTable datatable2 = new DataTable();
DataTable datatable3 = new DataTable();
ref_data.Columns.Add(new DataColumn("A", System.Type.GetType("System.Int32")));
ref_data.Columns.Add(new DataColumn("B", System.Type.GetType("System.Int32")));
ref_data.Columns.Add(new DataColumn("C", System.Type.GetType("System.Int32")));
ref_data.Columns.Add(new DataColumn("D", System.Type.GetType("System.Int32")));
ref_data.Columns.Add(new DataColumn("E", System.Type.GetType("System.Int32")));
ref_data.Columns.Add(new DataColumn("F", System.Type.GetType("System.Int32")));
datatable1.Columns.Add(new DataColumn("A", System.Type.GetType("System.Int32")));
datatable1.Columns.Add(new DataColumn("C", System.Type.GetType("System.Int32")));
datatable1.Columns.Add(new DataColumn("D", System.Type.GetType("System.Int32")));
// Duplicate datatable2 from ref_data
// and then we'll remove what we don't need
datatable2 = ref_data.Clone();
// What columns exist in reference datatable that do not exist in datatable1?
// Linq is probably more elegant but extensions are not working for me
// var column_collection = ref_data.Columns.Where(x => x.)
foreach (DataColumn item in ref_data.Columns)
{
// Build out datatable2 structure
if (datatable1.Columns.Contains(item.ColumnName))
{
datatable2.Columns.Remove(item.ColumnName);
}
}
// At this point, datatable 1 contains ACD, datatable2 contains BEF
Console.WriteLine($"Dumping datatable1");
foreach (DataColumn item in datatable1.Columns)
{
Console.WriteLine(item.ColumnName);
}
Console.WriteLine();
Console.WriteLine($"Dumping datatable2");
foreach (DataColumn item in datatable2.Columns)
{
Console.WriteLine(item.ColumnName);
}
Комментарии:
1. Чтобы использовать linq в таблице данных, вам нужно добавить System.Data.DataSetExtensions (как в using, так и в reference), а затем вы можете использовать AsEnumerable как dt. AsEnumerable. Выберите (строка => строка [«A»], строка [«B»], строка [«D»])