martes, diciembre 18, 2007

Conciliación en presencia de identidades

Copio a continuación un pequeño fragmento de un ejercicio del Volumen II, para que os hagáis una idea del tipo de problemas prácticos al que se enfrenta una aplicación preparada para las tres capas, y que tienen que tratarse obligatoriamente como parte de un curso serio sobre bases de datos.
Programación con ADO.NET en C# - Volúmenes I y IILa implementación que hemos proporcionado a SaveChanges es mínima, y no es difícil encontrar casos para los que tendremos que complicarla. El primer ejemplo: la inserción de registros en tablas que contienen columnas con el atributo identity. De hecho, todas nuestras tablas tienen como clave primaria una columna con dicho atributo. Para entender en qué consiste el problema, sigamos el rastro de una inserción de registros. Supongamos que el usuario ha tecleado el siguiente registro para la tabla de países:
<  -1, 'PN', 'Polo Norte'... >
He puesto –1 como clave primaria del nuevo registro, para evitar confusiones. Supondremos que este valor ha sido asignado automáticamente en el lado cliente. No obstante, al grabar el registro, el algoritmo de grabación recupera el valor asignado a la clave por el servidor. Este sería el estado del registro una vez insertado y actualizado:
<1234, 'PN', 'Polo Norte'... >
Recuerde, sin embargo, que la grabación se ejecuta sobre un conjunto de datos auxiliar que sólo contiene las filas con algún tipo de cambio. Para que el conjunto de datos original se actualice, tenemos que ejecutar la operación Merge. Este método utiliza las claves primarias para identificar los registros originales con sus copias más recientes. Y esto es un problema, precisamente porque la clave primaria ha sido modificada durante la inserción. Después de ejecutar Merge tendríamos dos copias del mismo registro, con valores diferentes en la clave primaria:
<  -1, 'PN', 'Polo Norte'... >
<1234, 'PN', 'Polo Norte'... >
¿Se da cuenta de que nos sobra el primero de los registros? Para evitar esta duplicación de las inserciones, tendríamos que eliminar los registros añadidos al conjunto de datos original antes de mezclar el contenido de delta. Esta es una versión más completa de SaveChanges:
public virtual bool SaveChanges()
{
DataSet delta = Data.Instance.Write(
dataset.DataSetName, dataset.GetChanges());
foreach (DataTable tab in dataset.Tables)
{
foreach (DataRow row in tab.Select(
null, null, DataViewRowState.Added))
{
row.Delete();
}
}
dataset.Merge(delta, false);
dataset.AcceptChanges();
return true;
}
No importa si alguna tabla no utiliza el atributo de identidad. Si borramos una fila añadida dentro del conjunto de datos original, de todos modos volveremos a incorporarla al mezclar el delta. Observe que, para cada tabla, detectamos los registros añadidos gracias a su estado, aplicando el método Select a la tabla.
Naturalmente, el código que hay que incluir para resolver estos problemas eminentemente prácticos no siempre es sencillo o evidente. De ahí la dificultad de escribir un curso de ADO.NET verdaderamente útil, y mi decisión de mantener la línea argumental del actual curso en su actualización.

Actualización: Para Navidad, actualización de la serie D a VS2005...

Etiquetas: ,

2 Comments:

Blogger Unknown said...

Hola Ian, te escribo desde Peru, te comente en un correo anterior el interes de adquirir el volumen I y el volumen II(en cuanto salga), estuve observando que para la forma de pago no esta Peru, espero puedas modificar ese detalle. Tambien te agradeceria me detalles los precios por ambos volumenes, veo ofertas que dicen compras combinadas, pero no veo una que diga comprar el kit complejo jejeje. Espero me puedas ayudar en tal sentido. Muchos saludos y espero pronto tener esos libros

viernes, diciembre 21, 2007 4:13:00 a. m.  
Blogger Ian Marteens said...

Hola, Miguel: escríbeme directamente a la cuenta mía en IntSight: la cuenta comercial la estamos leyendo un par de personas, y cuando se nos cruzan los mensajes nos hacemos un lío.

Ya están arreglados los dos formularios principales, pero evidentemente, no son los que necesitas. Escríbeme y te preparo uno a la medida: son muchas las combinaciones. La base de todo el sistema es el precio de envío: hasta un kilogramo, 20 euros, hasta dos, 40 euros. Todos los libros sobre .NET pesan menos de un euro, de manera que se puede combinar fácilmente 1 libro + 1 curso. Y te puedo hacer un descuento en la combinación.

viernes, diciembre 21, 2007 12:42:00 p. m.  

Publicar un comentario

<< Home