如何将一列插入到两个现有列之间的数据集中?
Posted
技术标签:
【中文标题】如何将一列插入到两个现有列之间的数据集中?【英文标题】: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。通常是因为你的老板要求这样做。 【参考方案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://***.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 函数中。
【讨论】:
以上是关于如何将一列插入到两个现有列之间的数据集中?的主要内容,如果未能解决你的问题,请参考以下文章