JASoft.org

El blog de José Manuel Alarcón Aguín. Programación web y mucho más...

MENÚ - JASoft: JM Alarcón

Método GetChanges en DataSets de la Compact Framework

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
Banner

Agregar comentario