2008-12-09 11 views
20

Estoy tratando de insertar una columna en un DataSet existente usando C#.¿Cómo se inserta una columna en un conjunto de datos entre dos columnas existentes?

Como ejemplo he definido un conjunto de datos de la siguiente manera:

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

más adelante en mi código que estoy queriendo insertar una columna entre la columna 2 y columna 4.

conjuntos de datos tienen métodos para agregar una columna, pero parece que no puedo encontrar la mejor manera de insertar una.

me gustaría escribir algo como lo siguiente ...

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

El resultado final debe ser un conjunto de datos que tiene una tabla con las siguientes columnas: columna_1 Columna_2 Columna_3 column_4

en lugar de: column_1 column_2 column_4 column_3 que es lo que el método add me da

seguramente debe haber una manera de hacer algo como esto.

Editar ... Apenas el deseo de aclarar lo que estoy haciendo con el conjunto de datos basado en algunos de los comentarios a continuación:

estoy recibiendo un conjunto de datos a partir de un procedimiento almacenado . Entonces, tengo que agregar columnas adicionales al conjunto de datos que luego se convierte en un documento de Excel . No tengo control sobre los datos devueltos por el proceso almacenado , así que tengo que agregar columnas después del hecho .

+0

Sólo por curiosidad, ¿por qué están tratando de hacer esto? Por lo general, no es una buena idea que el código de la base de datos dependa del orden en que se almacenan las columnas. – Ferruccio

+0

Estoy obteniendo un conjunto de datos de un procedimiento almacenado. Entonces, tengo que agregar columnas adicionales al conjunto de datos que luego se convierte en un documento de Excel. No tengo control sobre los datos devueltos por el proceso almacenado, así que tengo que agregar columnas después del hecho. – mezoid

+1

He estado allí. A veces solo tienes que escribir un truco. Usualmente, porque tu jefe lo exige. –

Respuesta

40

Puede utilizar el método DataColumn.SetOrdinal() para este fin.

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

Copie las dos primeras columnas en un nuevo conjunto de datos, luego agregue la tercera columna y agregue las columnas restantes.

Puede envolver eso en una función Insertar después de si es necesario.

8

que utiliza su sugerencia de crear un método de extensión para DataColumnCollection del conjunto de datos:

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

ahora puedo escribir:

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

Basado en https://stackoverflow.com/a/17372008/492336, utilizo SetOrdinal con IndexOf () para insertar bar antes de foo:

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

Para insertar después de foo sólo tiene que añadir +1:

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