Acerca de:

Este blog contiene los códigos, ejemplos y bases de datos que he usado cuando aprendía acerca de algún tema específico. En lugar de borrarlos (una vez dominado ya el tema), he decidido publicarlos :)

jueves, 29 de noviembre de 2012

Propiedad Select de un DataTable y Error al añadir un DataRow: ArgumentException Esta fila ya pertenece a otra tabla

Tengo un DataTable llamado dt1 que contiene muchos datos. Entre esos datos hay dos columnas llamadas "Nombre y Apellido" y "Edad". Deseo poner en otro DataTable los datos de todas las personas mayores de 18 años y que no sean Juan Perez ó Juan Pérez.
Los DataTables tienen una propiedad Select que acepta consultas tipo SQL para filtrar datos en función a los nombres de sus columnas. Si estos nombres contienen espacios se deben poner entre corchetes.
El código es el siguiente:

string query = @"([Nombre y Apellido] <> 'Juan Perez' or
                             [Nombre y Apellido] <> 'Juan Pérez') and Edad > 18";

DataTable dtFin = new DataTable();

DataRow[] miFiltro = dt1.Select(query);

if (miFiltro.Length > 0)
{

// primero añado las columnas con su respectivo nombre
    for (int i = 0; i < miFiltro[0].Table.Columns.Count; i++)
         dtFin.Columns.Add(miFiltro[0].Table.Columns[i].ColumnName);
           
    

// añado las filas
   for (int i = 0; i < miFiltro.Count(); i++)
         dtFin.Rows.Add(miFiltro[i]);

}

Pero al correr este código me tiraba una exceción del tipo "ArgumentException Esta fila ya pertenece a otra tabla".
Buscando en Internet, Pedro Hurtado me dió la solución. (yo no hice la pregunta, pero que es la solución, lo es :D)

El código correcto es:

string query = @"([Nombre y Apellido] <> 'Juan Perez' or

                             [Nombre y Apellido] <> 'Juan Pérez') and Edad > 18";

DataTable dtFin = new DataTable();

DataRow[] miFiltro = dt1.Select(query);

if (miFiltro.Length > 0)
{

// primero añado las columnas con su respectivo nombre
    for (int i = 0; i < miFiltro[0].Table.Columns.Count; i++)
         dtFin.Columns.Add(miFiltro[0].Table.Columns[i].ColumnName);
               

// añado las filas
   for (int i = 0; i < miFiltro.Count(); i++)
         dtFin.Rows.Add(miFiltro[i].ItemArray);

}

Faltaba ponerle la propiedad ItemArray al añadir los DataRows de miFiltro al DataTable dtFin.

No hay comentarios: