?id=37cbafb1-7183-4040-8bf3-1527b84ac4cd
Método GetChanges en DataSets de la Compact Framework
por José M. Alarcón
La .NET Compact Framework (DNCF) es estupenda y permite crear aplicaciones .NET para dispositivos móviles (Pocket PC y SmartPhone) con casi las mismas técnicas y objetos que se utilizan en el desarrollo de aplicaciones de escritorio comunes. Sin embargo la DNCF no nos ofrece todo lo que proporciona su hermana mayor, la propia plataforma .NET.
Una carencia importante es la ausencia del método GetChanges en la clase DataSet. Este método se utiliza en ADO.NET para obtener una copia del DataSet original que sólo contiene los elementos que han cambiado desde la última llamada a AcceptChanges(). Esto resulta de mucha utilidad a la hora de sincronizar cambios en el servidor sobre todo si transmitimos el DataSet a través de un servicio Web. Gracias a este método sólo enviamos los datos necesarios y no el DataSet completo.
Por desgracia la calse DataSet de la DNCF no soporta el método GetChanges por lo que, o enviamos todos los datos y los seleccionamos en el servidor, o nos trabajamos nosotros mismos un método alternativo para hacerlo.
Yo, obviamente, he optado por el segundo método y a continuación expongo la función que he creado para obtener un DataSet que contiene únicamente los cambios sufridos por el que se le pasa como parámetro:
public DataSet GetChanges(DataSet ds)
{
//Si no tiene cambios, se devuelve una referencia nula
if(!ds.HasChanges()) return null;
//Se crea un nuevo DataSet
DataSet dsCambios = new DataSet();
//En cada tabla del DataSet original
foreach(DataTable tabla in ds.Tables)
{
//Se clona la definición de la tabla en el nuevo DataSet
dsCambios.Tables.Add(tabla.Clone());
// se recorren los registros para comprobar si hay cambios
foreach (DataRow fila in tabla.Rows)
{
if (fila.RowState == DataRowState.Added ||
fila.RowState == DataRowState.Deleted ||
fila.RowState == DataRowState.Modified)
{
dsCambios.Tables[tabla.TableName].ImportRow(fila);
}
}
}
//Se devuelve el nuevo DataSet con los cambios
return dsCambios;
}
Como se puede observar, lo que hago es recorrer las tablas del DataSet original clonándolas en otro nuevo y comprobando cada una de las filas en busca de cambios (fila añadida, borrada o modificada), y en caso de haberlos importándola con el mismo estado al DataSet que contiene los cambios.
Con DataSets de muchos registros puede ser un método lento pero ahorrará mucho tráfico al enviar los cambios al servidor, aumentando el rendimiento de las aplicaciones.
Es bastante fácil crear una versión sobrecargada de este método que devuelva sólo un tipo determinado de cambios, al igual que hace el método GetChanges original. Se deja como ejercicio al lector ;-)
José Manuel Alarcón Aguín
Fundador de
campusMVP.es, el
proyecto de referencia en formación on-line para programadores en lengua española.
Autor de varios libros y cientos de artículos. Galardonado como
MVP de Microsoft desde 2004. Gallego de Vigo, amante de la ciencia y la
tecnología, la música y la lectura. Ayudando a la gente en Internet desde 1996.