【问题标题】:How modify datatable in C#如何在 C# 中修改数据表
【发布时间】:2020-11-08 06:03:29
【问题描述】:

我是 SSIS 的新手,我正在从 excel 源中获取数据。 Excel 源具有 A,B,C,D,E,F 之类的列。我创建了datatable1datatable1 contains columns A,C,D。现在我想从工作表中not in datatable1 的剩余列创建datatable2,但它给了我错误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)
}

【问题讨论】:

  • 基于此代码,您尚未将任何内容加载到数据表中。

标签: ssis script-task script-component


【解决方案1】:

如错误所示,您无法修改正在枚举的内容。

相反,枚举列的主列表。我打电话给我的ref_data。对于我找到的每一列,我询问datatable1 它是否有同名的列。如果是这样,我对datatable2 使用Remove 方法从集合中删除该列。

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

【讨论】:

  • 为了在数据表上使用 linq,您需要添加 System.Data.DataSetExtensions(在使用和参考中),然后您可以像 dt.AsEnumerable.Select(row => 一样使用 AsEnumerable行["A"],行["B"],行["D"])
猜你喜欢
  • 2010-11-22
  • 1970-01-01
  • 2020-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-04
  • 2012-04-02
相关资源
最近更新 更多