Как изменить datatable в C#

#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»])