none
Una consulta sobre la técnica de programación en capas. RRS feed

  • Pregunta

  • Estoy haciendo un proyecto usando la técnica de programación por capas, tengo definidos cuatro proyectos, uno para cada capa: De datos, lógica y para la presentación de los datos y una capa común a todas ellas para definir las diversas entidades.

    Deseo obtener un DataTable para llenar un control DataGridView, pero no me queda claro cómo transferir los datos entre la capa de Acceso a Datos y la capa lógica y de allí a la interfaz.

    La consulta es la siguiente: Trato de llenar un control DataGridView a partir de un DataTable. En la capa de acceso a datos defino el método que hace la consulta SQL y así obtengo un DataTable con los datos hasta allí está ok, pero resulta que en la capa lógica no debo usar el DataTable sino entidades, menos aún en la interfaz de usuario, porque se supone que estas capas "no se enteran" qué gestor de base de datos se usa para obtener los datos.

    Entonoces ¿cómo hago que lleguen los datos desde el DataTable (obtenido en la capa de acceso a datos) al control DataGridView (que obviamente está en la capa interfaz), pasando por la capa lógica. ¿Cómo hago esa transición?

    Ojalá me puedan dar luces al respecto que estoy algo confundido.





    domingo, 26 de mayo de 2019 7:46

Respuestas

  • Tienes que tomar una decisión en cuanto a qué clase de entidades vas a transportar entre capa y capa. Es lícito decidir que tus entidades van a ser de tipo "DataTable" (es universal, no depende de la base de datos a la que te conectes), pero entonces deberías usar DataTables en todas las capas. O bien puedes definir clases tuyas para usarlas como entidades y entonces tendrías que usar esas clases en todas las capas, y no deberías usar DataTables en ninguna de ellas.

    No es que no se pueda hacer la conversión, podrías leer las filas de un datatable y meter los campos en una lista de entidades y viceversa, pero es un paso superfluo y que en realidad no tiene sentido. No hay razón para mezclar ambas cosas. Bueno, sí hay una razón: desconocimiento. Puede ser que solo hayas estudiado cómo leer desde la base de datos a un datatable y en consecuencia no sepas generar tu capa de datos de ninguna otra manera. Pero en este caso lo correcto no es empeñarse en seguir usando esa técnica, sino aprender cómo leer desde una base de datos directamente hacia las entidades, para no tener que usar el datatable (pista: lo más sencillo - aunque no es la única opción - es usar un ORM tal como Entity Framework).

    • Propuesto como respuesta Javi Fernández F domingo, 26 de mayo de 2019 12:32
    • Marcado como respuesta James2016-2 domingo, 26 de mayo de 2019 19:43
    domingo, 26 de mayo de 2019 10:23
  • Entity Frameawork (EF) tiene varias formas de funcionar. Una de ellas se llama "Database First", y en esta primero creas la base de datos usando las herramientas que desees, y luego desde tu proyecto le dices que quieres conectarte a ella y automáticamente te genera todo un conjunto de clases (las "entidades") que tienen la misma estructura que las tablas de la base de datos, y también te proporciona el código para leerlas y grabarlas.

    Otra alternativa es la que se llama "Code First". Con esta, escribes tú las clases que representan las entidades, las decoras con una serie de atributos para indicar las características que no se deducen del tipo (por ejemplo, la longitud de los strings), y entonces el programa al ejecutarse te crea automáticamente en la base de datos todas las tablas necesarias para almacenar esas entidades.

    • Marcado como respuesta James2016-2 lunes, 27 de mayo de 2019 21:51
    lunes, 27 de mayo de 2019 12:48
  • La forma de trabajar con Database First es agregar al proyecto un fichero .edmx (es una de las opciones que salen en Visual Studio cuando seleccionas añadir nuevo item al proyecto). Entonces se dispara un asistente que te pregunta lo que quieres hacer. Le das la información para conectarse a tu base de datos, y te genera todas las entidades en una serie de ficheros debajo del .edmx.

    • Marcado como respuesta James2016-2 lunes, 27 de mayo de 2019 21:09
    lunes, 27 de mayo de 2019 18:31

Todas las respuestas

  • Tienes que tomar una decisión en cuanto a qué clase de entidades vas a transportar entre capa y capa. Es lícito decidir que tus entidades van a ser de tipo "DataTable" (es universal, no depende de la base de datos a la que te conectes), pero entonces deberías usar DataTables en todas las capas. O bien puedes definir clases tuyas para usarlas como entidades y entonces tendrías que usar esas clases en todas las capas, y no deberías usar DataTables en ninguna de ellas.

    No es que no se pueda hacer la conversión, podrías leer las filas de un datatable y meter los campos en una lista de entidades y viceversa, pero es un paso superfluo y que en realidad no tiene sentido. No hay razón para mezclar ambas cosas. Bueno, sí hay una razón: desconocimiento. Puede ser que solo hayas estudiado cómo leer desde la base de datos a un datatable y en consecuencia no sepas generar tu capa de datos de ninguna otra manera. Pero en este caso lo correcto no es empeñarse en seguir usando esa técnica, sino aprender cómo leer desde una base de datos directamente hacia las entidades, para no tener que usar el datatable (pista: lo más sencillo - aunque no es la única opción - es usar un ORM tal como Entity Framework).

    • Propuesto como respuesta Javi Fernández F domingo, 26 de mayo de 2019 12:32
    • Marcado como respuesta James2016-2 domingo, 26 de mayo de 2019 19:43
    domingo, 26 de mayo de 2019 10:23
  • mm entiendo, uso una u otra pero no una mezcolanza de ambas, creo que opto entonces por usar DataTable, es que ya tengo estructurado así el proyecto.

    Aunque me gusta la idea de experimentar con la otra opción, leyendo desde una base de datos directamente hacia entidades para prescindir del DataTable.

    El ORM Entity Framework es parecido al Erwin ¿noo? Pero entonces cómo sería la comunicación entre el Entity Framework y el programa, o sea hago el diseño de la base de datos, defino allí sus entidades, propiedades, etc. y luego cómo los empalmaría, o sea cómo obtendría los datos para pasárselo a un control DataGridView por ejemplo.

    domingo, 26 de mayo de 2019 19:43
  • Entity Frameawork (EF) tiene varias formas de funcionar. Una de ellas se llama "Database First", y en esta primero creas la base de datos usando las herramientas que desees, y luego desde tu proyecto le dices que quieres conectarte a ella y automáticamente te genera todo un conjunto de clases (las "entidades") que tienen la misma estructura que las tablas de la base de datos, y también te proporciona el código para leerlas y grabarlas.

    Otra alternativa es la que se llama "Code First". Con esta, escribes tú las clases que representan las entidades, las decoras con una serie de atributos para indicar las características que no se deducen del tipo (por ejemplo, la longitud de los strings), y entonces el programa al ejecutarse te crea automáticamente en la base de datos todas las tablas necesarias para almacenar esas entidades.

    • Marcado como respuesta James2016-2 lunes, 27 de mayo de 2019 21:51
    lunes, 27 de mayo de 2019 12:48
  • Interesante, ya que tengo la base de datos hecha, creo que el modo Database First me resulta más práctico, voy a investigar y probar al respecto. Gracias por las pautas.
    lunes, 27 de mayo de 2019 15:17
  • La forma de trabajar con Database First es agregar al proyecto un fichero .edmx (es una de las opciones que salen en Visual Studio cuando seleccionas añadir nuevo item al proyecto). Entonces se dispara un asistente que te pregunta lo que quieres hacer. Le das la información para conectarse a tu base de datos, y te genera todas las entidades en una serie de ficheros debajo del .edmx.

    • Marcado como respuesta James2016-2 lunes, 27 de mayo de 2019 21:09
    lunes, 27 de mayo de 2019 18:31