[SOURCE] ABM basico + SQL (.NET) (con clases) 3 capas

Iniciado por seba123neo, 15 Agosto 2012, 01:54 AM

0 Miembros y 1 Visitante están viendo este tema.

seba123neo

Hola, por fin les traigo este primer proyecto para .NET, de una lista de proyectos que voy a publicar para ayudar a los que recien empiezan sobre todo, viendo la cantidad de preguntas que siempre hay sobre el tema de bases de datos.

esto creo que si va a servir, ya que veo miles de preguntas en todos lados de esto.

una ves que estos ejemplos esten publicados puedo asegurar que practicamente estas dudas desapareceran para siempre, aparte estos ejemplos no serviran solamente para saber como conectarse debidamente a la base de datos, sino tambien como usar los recordset, los comandos, hacer insert a la base, consultar, cargar listas, etc.

Que son 3 capas ?. Para mas informacion ver este link:

Programación por capas

un explicación simple:

supongamos que voy a hacer un ABM de clientes y de articulos.

en el proyecto, te creas clases, esas clases las separas en proyectos distintos, una seria la capa de Datos, esta seria la capa mas "profunda" o tercera capa, si trabajas con bases de datos, esta capa se encarga de la conexion a la base de datos y de ejecutar las consultas y comandos que vienen de la segunda capa(la capa de Negocio).

la segunda capa (la de "Negocio") se encargaria de preparar los SELECT a la base de datos, y preparar los comandos a ejecutar, que seran enviados a la tercera capa que vimos arriba (la de "Datos").

Por ejemplo, quiero hacer un ABM de clientes, entonces me creo una clase llamada cCliente y ahi pongo todas las propiedades y metodos necesarios para manegar los clientes, insertar, actualizar,borrar..etc, lo mismo me creo una clase para la de articulos llamada cArticulos, para cada "Entidad" te creas una clase y ahi mismo pones sus metodos.

y la primer capa, la de "Presentación" (que seria la interfaz del programa), ahi haces todo llamando siempre a los metodos de la segunda capa (la capa de "Negocio"), supongamos que yo aprieto un boton y quiero borrar un cliente, entonces llamo al metodo de borrarCliente de la clase cCliente.


El proyecto es de lo mas basico que se me pudo ocurrir, por eso decidi hacer algo simple para que todos lo entiendan y vean como funciona, en este caso se me ocurrio un AMB de Paises-Provincias-Ciudades el cual cada pais esta relacionado a N provincias y cada provincia relacionado a N ciudades en la base de datos.

Esta realizado con Visual Studio 2008 en visual basic, con base de datos en Access 2003 (deberia ser compatible con cualquier version de visual studio ya que no usa nada externo, es puro codigo).

Viendo la cantidad de preguntas de bases de datos que siempre hay, este proyecto lo que trata de mostrar es como trabajar correctamente con bases de datos, usando SQL para las consultas e instrucciones, y usando 3 capas, de esta forma hacerlo de la mejor manera posible y hacerlo como se debe hacer, ya que hay varias formas de hacerlo, pero correctamente solo hay algunas.


  • Se uso el espacio de nombres System.Data.OleDb que es lo que se debe usar para conectarse a una base de Access, por lo tanto los 3 objetos principales que se usaron son OleDbConnection (para realizar la conexion a la base de datos), OleDbDataReader (para hacer los SELECT) y OleDbCommand (para ejecutar los comandos SQL como INSERT, UPDATE o DELETE). Como sabran, si el proyecto se quiere pasar a otro motor como SQL Server se debera usar el espacio de nombres System.Data.Sql y los 3 objetos que nombre anteriormente seran los mismos solo que bajo este espacio de nombres, lo mismo si lo quieren hacer para MySQL u otro motor.

Paso a explicar la estructura del Proyecto:

asi se ve le proyecto terminado:





  • Carpeta UI: esta carpeta representa la primer capa llamada comunmente "capa de presentación", (UI = User Interface) esta es la interfaz que se presenta al usuario, en este ejemplo aqui se encuentran los formularios respectivos para el ABM, los cuales se encargaran de llamar a la segunda capa para que le provea de los datos a mostrar.


  • Carpeta Reglas: esta carpeta representa la segunda capa llamada comunmente "capa de negocio", aca se encuentran las "reglas" de negocio o la logica. aqui se ejecutan las consultas y se escriben los comandos a ejecutar. cada entidad esta representada por una clase, donde dentro de esta se escribe toda su logica, en este proyecto al tener 3 entidades principales, se crearon 3 clases que representan a cada una de ellas (tambien son las 3 tablas que contiene la base de datos), las clases son cPais, cProvincias, cCiudades.


  • Carpeta Datos: esta carpeta representa la tercer capa llamada comunmente "capa de datos", aca se encuentra la clase llamada cBaseDatos que es la encargada de la conexion a la base y de ejecutar las consultas y comandos, y devolver el resultado a la segunda capa.

La carpeta Utiles no tiene nada que ver con las 3 capas, es simplemente una carpeta para poder poner clases que nos sean utiles en el proyecto, en este caso yo uso una clase donde tengo funciones publicas, y tambien una clase que me permite simular la propiedad ItemData de VB6, en los combobox de .NET que se usaran en el proyecto.

El modulo llamado modMain es el modulo principal (es un modulo normal, no de clase) por donde se inicia la aplicación y se conecta a la base de datos, antes de que se muestre el primer formulario al usuario, (no se inicia por el Load de ningun formulario como se hace comunmente, que no esta mal, pero es recomendable hacerlo de esta forma con el modulo). Es como el Sub_Main de VB6, hay que especificarle desde las propiedades del proyecto que comienze por ahi, sino no funciona.

El codigo del modulo es el siguiente, paso a explicarlo.

Código (vbnet) [Seleccionar]
Imports System.IO

Module modMain

   ' -----------------------------
   ' \\ -- Clases
   ' -----------------------------

   Public oDB As cBaseDatos
   Public oPaises As cPaises
   Public oProvincias As cProvincias
   Public oCiudades As cCiudades

   ' -----------------------------
   ' \\ -- Variables Globales
   ' -----------------------------
   Public gCadenaConexion As String

   Public Sub Main()

       Try

           If File.Exists(cUtiles.AppPath & "\datos.mdb") = False Then
               MessageBox.Show("No existe la base de datos.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
               End
           Else
               gCadenaConexion = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=datos.mdb;"
           End If

           oDB = New cBaseDatos
           oDB.Conectar()

           oPaises = New cPaises
           oProvincias = New cProvincias
           oCiudades = New cCiudades

           Application.EnableVisualStyles()
           Application.Run(frmMenu)

       Catch ex As Exception
           MessageBox.Show("Error al Inicar. " & vbNewLine & "Descripción del Error: " & ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
       End Try
   End Sub
End Module



1 - Primero se declaran las variables globales que seran las instancias de los objetos (clases) durante todo el proyecto. La variable oDB sera la que contenga la clase de la primer capa, encargada de la conexion, luego declaramos de la misma forma una variable para cada entidad (paises, provincias, ciudades).

Luego de chequear que exista la base de datos en el directorio del .exe, se conecta a la base de datos con la cadena de conexion respectiva para Access, luego de conectar, instancia finalmente las clases y se ejecuta el formulario principal.

Formulario Principal:



Este es el formulario principal que solo contiene el menu para acceder a las diferentes pantallas, nada mas.

Formulario Paises:



Este formulario contiene lo que seria la "tabla principal" del ABM, los paises que sean dados de altas aqui, sera posible en las otras pantallas poder relacionarle provincias (tambien llamados estados en venezuela o EE.UU) y luego a las provincias relacionarle ciudades. En este ejemplo solo he dado de alta estos 2 paises como algo basico.

Nota: TODOS los formularios de ABM contienen el mismo formato, una grilla principal, con un manu superior con 3 botones para Agregar, Editar o Eliminar, y al costado derecho un panel para poder poner los diferentes campos de busqueda.

en esta pantalla el campo para buscar es simplemente el campo "nombre" (ya que no contiene otro campo).

Formulario Provincias:



Este formulario muestra todas las provincias (la cual las podemos relacionar a los paises), la busqueda ademas del campo "nombre" contiene ahora un combo para permitir al usuario poder ver solo las provincias de un determinado pais.

Formulario Ciudades:



Este formulario muestra todas las ciudades (la cual las podemos relacionarlas a una determinada provincia), la busqueda ademas del campo "nombre" contiene ahora 2 combos para permitir al usuario poder ver solo las provincias de un determinado pais o de una determinada provincia, pero algo importante que tienen estos combos, es que funcionan en modo "cascada", es decir si primero selecciono el pais argentina, el combo de provincias solo se llenara con las provicnais de este pais y no de otro, de esta forma podemos buscar mas exactamente y rapido, sino la busqueda seria desordenada y quedaria truncada.

bueno aqui termina el resumen, abajo esta el link de descarga del proyecto entero con el codigo fuente, cualquier duda que tengan, escriban aqui sin problema por favor.

Descargar: ABM basico + SQL (.NET) (con clases) 3 capas.rar (386 Kb)

Saludos.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

Novlucker

Aunque tal vez no este del todo de acuerdo en cuanto al planteo de la separación de capas y el manejo de los objetos entre cada una, es un muy ejemplo para quienes comienzan :D


Y remarcar esto último, que hacer este tipo de ejemplos llevan su tiempo :P


Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

seba123neo

faltaria separar las clases en proyectos diferentes para que sea realmente 3 capas obviamente, lo que pasa que esta asi para que se entienda mas facil.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

Novlucker

Yo me refería más bien a la responsabilidad de cada capa. En el ejemplo, la capa de Datos no es más que un helper para realizar operaciones sobre base de datos. En este caso la capa de Negocios es la encargada de armar las querys (SELECT, UPDATE, etc) a pasarle a la capa de Datos, pero eso no debería ser responsabilidad de esta capa.

Por ejemplo, si el día de mañana quiero cambiar la capa de datos y en lugar de Access utilizar MongoDB para la persistencia, la sintaxis de las consultas sería completamente diferente y deberías de redefinir tanto la capa de Datos como la de Negocio, en lugar de solo cambiar una capa.

Otra cosa es el manejo de DataReaders entre capas, son objetos de Datos, la aplicación en las capas superiores debería de manejar objetos de Negocio sin tener que preocuparse por como se llama la columna de una tabla para poder mostrarlo en una grilla.

Y lo último, que más que crítica es una buena práctica, es el cerrar las conexiones a base de datos en la medida que se las necesita. Esta claro que en aplicaciones pequeñas no es problema el número de conexiones concurrentes a la base de datos, pero en la medida de que esto se vuelve necesario, pasa a ser un problema.

Como digo, son solo algunos comentarios de como veo el manejo de capas.

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

cristiantorres

Estoy de acuerdo con lo que comentan arriba.

Has planteado mal la responsabilidad de cada capa, ya que en la capa Datos es donde tendrias que tener todas las query a tu bd es decir las consultas select, update, delete, insert, la capa Negocio no tendría porque tener consultas a tu bd ya que mas bien esta se usa para hacer las validaciones que tienes que aplicar según sea la aplicacion que se desarrolle, es decir comprobar que los datos que se le pasan a la capa Datos sean del mismo tipo que los de tu bd sacar cálculos etc pero no tendría porque la capa Negocio tener consultas a tu bd.

Pero por lo demás buen aporte yo se lo mucho que se toma armar este tipo de artículos.

Saludos.
Visita mi Blog C#, Asp.Net, Python y mas...
http://cristiantorresalfaro.blogspot.com

seba123neo

claro, tienen razon en lo que dicen >:D, que la capa de negocios no deberia tener las consultas, solo la capa de datos debe hacerlo. creo que hice mal en poner 3 capas y hubiera dejado el titulo como "(con clases)" y listo, lo que queria mostrar es como separar la logica de cada entidad en clases diferentes y no hacer el mamarracho de poner todo el codigo en el formulario, ya que les puedo asegurar que los que recien empiezan que no saben nada, hacen los select directamente en el formulario y queda un lio tremendo, mil lineas de codigo, cuando se puede reducir a 30 separando en clases.

Cita de: Novlucker en 16 Agosto 2012, 17:52 PM
Y lo último, que más que crítica es una buena práctica, es el cerrar las conexiones a base de datos en la medida que se las necesita. Esta claro que en aplicaciones pequeñas no es problema el número de conexiones concurrentes a la base de datos, pero en la medida de que esto se vuelve necesario, pasa a ser un problema.

eso es discutible y segun cada necesidad, en internet esta plagado de temas sobre modo conectado vs desconectado, en este ejemplo al no manejar dataset ni nada por el estilo y solo llenar grillas, se puede trabjar de modo conectado tranquilamente, la verdad nunca tuve en claro bien la utilidad del modo desconectado (que tambien tiene sus desventajas), he visto sistemas de gestion gigantes en VB6 que estan en modo conectado todo el tiempo, y acceden varias estaciones de trabajo a la misma base e implementean rutinas de bloqueos a los registros y demas para arreglar este tema  y se las arreglan bastante bien.

saludos.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

Novlucker

Por eso digo que es una buena práctica a tener en cuenta, pero no necesariamente un error.

Pero voy a citar dos ejemplos:
1) En el caso de una aplicación web (http://msdn.microsoft.com/en-us/magazine/cc163854.aspx). Tal vez mi problema es que estoy pensando en la posibilidad de migrar una aplicación de escritorio a una web, algo más que común en la actualidad.
2) Podrían haber casos como este, en los cuales tu aplicación no podría ejecutarse más de 5 veces :P



Pero como digo, dependerá en parte del caso.

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein