En mi anterior 'post' titulado Usar un ObjectDataSource con un DataSet tipado en ASP.NET 2.0 se me olvidó comentar un detalle. Si aún a pesar de lo que te digo quieres usar el ObjectDataSource para realizar actualizaciones a través de un DataSet tipado puedes conseguir que funcione. Para ello desmarca la opción de "Actualizar campos de la base de datos" en el diálogo de configuración del TableAdapter que vayas a utilizar enlazado a este objeto.

Esto elimina el último parámetro del método Update, teniendo por tanto el número de parámetros correcto y funcionará sin problemas. O casi...

El inconveniente ahora es que los valores auto-generados por la base de datos no se recuperarán tras la actualización o añadido de datos. Por ejemplo los autonuméricos. Esto tiene una implicación que puede engañar a mucha gente, incluso a programadores experimentados. Lo relato a continuación.

ATENCIÓN: Puede que si lo usas y añades un registro, de repente, veas que sí tienes el autonumérico correcto en tu control enlazado. Pero ¿en qué quedamos? ¿no habíamos marcado la opción para que no se actualizara? Entonces, ¿cómo es que obtengo el autonumérico igual? No entiendo nada...

Vale. Lo que pasa es una ilusión "óptica". Lo que obtenemos no es el autonumérico real sino uno autogenerado por el DataSet. El DataSet tipado tiene los campos autonuméricos marcados como tales y cuando se introduce un nuevo registro en memoria incrementan su valor del mismo modo que pasaría en la base de datos. Esto se hace para poder relacionar registros entre tablas en memoria pero no tienen un valor real ya que, en general, no van a coincidir con los autonuméricos que se generarán en la base de datos por muchos motivos: puede que haya huecos por inserciones no confirmadas y, sobre todo, seguramente habrá varios usuarios introduciendo datos simultáneamente.

Por este motivo si pruebas la aplicación tú solo, sin más usuarios introduciendo datos, tendrás la ilusión de que obtienes los valores autonuméricos de la base de datos cuando en realidad no es así. Si te fias de esto luego en la realidad (cuando la aplicación esté en producción) verás que los autonuméricos que usas no coinciden en muchos casos con los reales y te puedes volver loco para encontrar en dónde está el error. Así que mucho ojo.

Para evitar este tipo de problemas yo lo que recomiendo es establecer el valor inicial de los campos autonuméricos del DataSet tipado en -1 y el incremento también en esta cantidad. De este modo los autonuméricos de memoria tendrán todos valores negativos y los de la base de datos serán positivos, siendo muy fácil distinguir unos de otros.

Espero que esta disertación, aunque algo "espesa", llegue a calar ya que según mi experiencia este problema lo va a tener muuuucha gente. Eso seguro. Así que ya sabes: "yo la primera vez lo leí en el Blog de Jose Alarcón" ;-)

💪🏻 ¿Este post te ha ayudado?, ¿has aprendido algo nuevo?
Pues NO te pido que me invites a un café... Te pido algo más fácil y mucho mejor

Escrito por un humano, no por una IA