jueves, 7 de febrero de 2008

No agregue tablas con el mismo nombre

QUÉ SUCEDE AL AGREGAR UNA TABLA A UN DATASET QUE CONTIENE YA UNA TABLA CON EL MISMO NOMBRE?

Esta duda se me originó cuando en una aplicación Web, desde las capas superiores le enviaban a la de presentación un DataSet con datos de tablas referenciales (es decir, aquellas que no sufrían mucho cambio); dada su naturaleza decidí poner este dataset en el singleton de la aplicación. Pero sucede que luego decidieron que las tablas de referencia en realidad iban a cambiar de cuando en vez. Así que había que proveer un mecanismo para informar al singleton que su dataset había cambiado y se debería recargar una(s) de sus tablas. No obstante dada la separación de capas y que no existe en la capa de presentación acceso a los TableAdapters, la única solución fue bajar de nuevo la tabla ya actualizada.
Para esto recurrí primero a dataSet.Tables["nombre"]=servicio.GetTable["nombre"];pero es erróneo porque dataSet.Tables["nombre"] es de solo lectura y no se puede cambiar.
Así que luego ví:dataSet.Tables.Add(table);
pero como se supone que la tabla ya existe, no sabía que consecuencias implicaría hacer esto. Busqué en la yuda y no encontré nada fácilmente. Así que decidí que sería más rápido investigar por mi propia cuenta.Lo que sucede es que al intentar agregar una tabla con el nombre de una que ya existe, se produce una excepción que arroja más o menos ese mismo mensaje. Así que no es que se produzca un "merge" de los datos, ni que halla un reemplazo del obketo tabla como tal. Sencillamente, no se puede.
La solución, bastante sencilla: Si existe un Add, obviamente ha de existir un Remove. De esta manera, usando el Remove anteriormente al Add, para la misma tabla se obtiene el reemplazo con los datos actualizados.
Sin embargo, el problema que originó buscar esta solución, obviamente está basado en un sitio Web mal concebido desde sus principios, pues esta última solución no es la mejor, pues lo ideal, sería que el cambio se hiciera en la capa local y luego en la capa superior, o que solo se trajeran los registros actualizados de la capa superior, y no de nuevo toda la tabla.
Pero por premuras de tiempo y errores sucesivos en el diseño, me vi forzado a buscar esta solución no muy grata. Espero poder convencer de usar lo último que en realidad sería más rápido que volver a traer todos los datos.

No hay comentarios: