JASoft.org

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

MENÚ - JASoft: JM Alarcón

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.

José Manuel Alarcón
Banner

Comentarios (1) -

Y hay muchos más bugs en .NET ???

Responder

Agregar comentario