【问题标题】:How does one insert a column into a dataset between two existing columns?如何将一列插入到两个现有列之间的数据集中?
【发布时间】:2010-09-25 23:29:09
【问题描述】:

我正在尝试使用 C# 在现有数据集中插入一列。

作为一个例子,我有一个如下定义的数据集:

DataSet ds = new DataSet();
ds.Tables.Add(new DataTable());
ds.Tables[0].Columns.Add("column_1", typeof(string));
ds.Tables[0].Columns.Add("column_2", typeof(int));
ds.Tables[0].Columns.Add("column_4", typeof(string));

稍后在我的代码中,我想在第 2 列和第 4 列之间插入一列。

DataSet 有添加列的方法,但我似乎找不到插入列的最佳方法。

我想写一些类似下面的东西......

...Columns.InsertAfter("column_2", "column_3", typeof(string))

最终结果应该是一个数据集,其中包含一个包含以下列的表: column_1 column_2 column_3 column_4

而不是: column_1 column_2 column_4 column_3 这是 add 方法给我的

肯定有办法做这样的事情。

编辑...只是想根据下面的一些 cmets 澄清我对 DataSet 所做的事情:

我正在从存储的 程序。然后我必须添加 数据集的附加列 然后将其转换为 Excel 文档。我无法控制 存储过程返回的数据 所以我必须在之后添加列 事实。

【问题讨论】:

  • 只是出于好奇,为什么要这样做?数据库代码依赖于存储列的顺序通常不是一个好主意。
  • 我正在从存储过程中获取数据集。然后我必须向数据集添加额外的列,然后将其转换为 Excel 文档。我无法控制存储过程返回的数据,所以我必须在事后添加列。
  • 我去过那里。有时你只需要写一个 hack。通常是因为你的老板要求这样做。

标签: c# insert dataset


【解决方案1】:

您可以为此目的使用DataColumn.SetOrdinal() 方法。

DataSet ds = new DataSet();
ds.Tables.Add(new DataTable());
ds.Tables[0].Columns.Add("column_1", typeof(string));
ds.Tables[0].Columns.Add("column_2", typeof(int));
ds.Tables[0].Columns.Add("column_4", typeof(string));
ds.Tables[0].Columns.Add("column_3", typeof(string));
//set column 3 to be before column 4
ds.Tables[0].Columns[3].SetOrdinal(2);

【讨论】:

    【解决方案2】:

    我根据您的建议为 DataSet 的 DataColumnCollection 创建了一个扩展方法:

    public static void InsertAfter(this DataColumnCollection columns, 
                                  DataColumn currentColumn, DataColumn newColumn)
    {
        if (!columns.Contains(currentColumn.ColumnName))
           throw new ArgumentException(/** snip **/);
    
        columns.Add(newColumn);
        //add the new column after the current one
        columns[newColumn.ColumnName].SetOrdinal(currentColumn.Ordinal + 1); 
    }
    

    我现在可以写了:

     dt = ds.Tables[0];
     dt.Columns.InsertAfter(dt.Columns["column_2"], new DataColumn("column_3"));
    

    【讨论】:

      【解决方案3】:

      基于https://stackoverflow.com/a/17372008/492336,我使用带有IndexOf()的SetOrdinal在foo之前插入bar

      table.Columns.Add("bar").SetOrdinal(table.Columns.IndexOf("foo"));
      

      要在foo 之后插入它,只需添加+1

      table.Columns.Add("bar").SetOrdinal(table.Columns.IndexOf("foo")+1);
      

      【讨论】:

        【解决方案4】:

        将前两列复制到一个新数据集中,然后添加第三列,并添加剩余的列。

        如有必要,您可以将其包装在 InsertAfter 函数中。

        【讨论】:

          猜你喜欢
          • 2021-01-28
          • 2015-11-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多