Otro bug de .NET que he descubierto: valores calculados en DataSet tipados.

Este bug lo he descubierto hace poco y lo puse en su día en la página de Connect de Microsoft. El caso es que hasta la fecha nadie ha dicho “esta boca es mía”, pero para mi se trata de un error claro. A continuación describo la situación así como la forma de salvarla con el menor esfuerzo…:


Una aplicación Web (imagino que en una Windows pasaría lo mismo, pero no lo he comprobado). Creas un DataSet tipado con su correspondiente TableAdapter para realizar el acceso a datos. A los campos devueltos le añades manualmente uno nuevo (o varios) que serán campos calculados a partir de los otros (por ejemplo, asignándole una expresión del tipo “Apellidos + ‘,’ + Nombre”).


Ahora pruebas el TableAdapter con la opción de vista previa y verás que, en efecto, todo va bien y la nueva columna muestra el valor calculado que se supone que debería tener.


De acuerdo… Ahora escribes código en tu aplicación que instancia el TableAdapter y llama a la versión ‘Get’ del método de acceso a datos (como sabrás hay normalmente otra por defecto que suele empezar por ‘Fill’ ¿me explico?). Resultado: el campo calculado está vacío. No funciona.


El motivo es que las expresiones que has definido para los campos calculados se asignan en el DataSet tipado mediante una llamada al método privado InitExpressions que se autogenera. Lo malo es que esta llamada la han puesto únicamente en el constructor del DataSet completo. Si usas directamente el TableAdapter para obtener y rellenar el correspondiente DataTable (lo habitual) no se llama a este método puesto que se ha instanciado directamente el DataTable, no el DataSet y luego cada uno de sus DataTable. Es fácil de entender lo que digo si te paras a pensarlo. De todos modos puedes ver el código fuente autogenerado para el DataSet tipado y sus elementos haciendo doble clic sobre él en el explorador de clases.


La mejor solución es instanciar el DataSet (se llama al constructor, claro) y luego usar el método ‘Fill’ para llenar la tabla adecuada. Con esto se soluciona pero es un poco “peñazo”. Además debería dar el mismo resultado instanciando el DataTable desde ‘Get’. Cada DataTable debería tener su propio InitExpressions particular en el constructor, en lugar de un único para todo el DataSet. ¿No?


En fin, que si alguna vez usas expreiones calculadas en un DataSet tipado y no te funcionan ya sabes por donde van los tiros y como solucionarlo.

Sin categoría

3 thoughts on “Otro bug de .NET que he descubierto: valores calculados en DataSet tipados.

  1. Impecable la explicacion, mañana lo pruebo.. a mi me paso con sqlserver 2005 pero lo comico es que cuando usaba el dataset con una bd de access funciona…

    pero igual es muy bueno el ejemplo

  2. Pues, les comento que me sucedió el mismo problema ya hace tiempo, ( mas de un año ) y pues Microsoft no se digna a darle una solución practica ( eficiente para los programadores ) y pues para no perder tiempo en aquel entonces y lo sigo haciendo ahora con mucho descontento modifique el código del dataset.designer.vb cambiando el insertcomand y el updatecomand lo cual es bastante molesto por suerte no he tenido que enfrentarme a muchos campos calculados, en ese momento mi solución dejara de ser factible…..

  3. Hola Daniel:

    OJO con modificar el dataset.designer.vb y similares: si lo ahces en cuanto refresqus las tablas desde el diseñador PERDERÁS TODOS LOS CAMBIOS.

    La forma de hacer esto correctamente es usar otro archivo para trabajar con la clase parcial, de forma que puedas ampliar la funcionalidad de la misma sin tener que tocar el código generado automáticamente por el diseñador.

    Saludos

    JM

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *