none
¿Cuál es la manera correcta de conectarse a una base de datos? RRS feed

  • Pregunta

  • ¡Hola!

    Estoy aprendiendo a hacer aplicaciones de Windows Forms, actualmente estoy desarrollando una del tipo CRUD, multiusuario. Ya hice dichas operaciones, sin embargo, mi duda es la siguiente: ¿cuál es la mejor manera de tratar la conexión a la base de datos? ¿Qué patrones de diseño o formas de conectarme a la base de datos es la más óptima en cuanto a velicidad de transacciones o uso de la memoria?

    Como lo estoy manejando es con la información del servidor y esos datos en un archivo App.config y una clase que recoge el string de ese archivo y hace el método de conexión:

    class BaseDatos : IDisposable
        {
            public BaseDatos()
            {
            }
    
            public SqlConnection conexionAcademica()
            {
                try
                {
                    SqlConnection conexion = new SqlConnection(ConfigurationManager.ConnectionStrings["academica"].ToString());
                return conexion;
                    
                }
                catch (Exception)
                {
                    MessageBox.Show("No se pueden obtener los datos. Inténtelo de nuevo", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                throw;
                }
            }
    
    
    
        void IDisposable.Dispose()
        {
            //throw new NotImplementedException();
        }
    }

    Sin embargo, esta conexión la uso varias veces, y para cada clase o formulario donde la uso pues hago esto:

    BaseDatos conexion = new BaseDatos();

    Y ya con la variable conexion accedo a los métodos de la clase. ¿Hay una mejor práctica para realizar esto? Sé que puedo aplicar patrones de diseño, pero estaba leyendo que Singleton no es conveniente para entornos multiusuario. Por otra parte, no sé si un Object Pool sea conveniente por lo mismo, además de que no sé como manejar la herencia de este método, por lo mismo de que mis clases ya heredan de Form.

    Muchas gracias.

    lunes, 5 de marzo de 2018 21:02

Todas las respuestas

  • Hola,

    Personalmente, he estado trabajando con la tecnología Entity Framework, se adapta a mis necesidades. Las conexiones a la BD las construyes mediante un asistente desde Visual Studio, se crea un modelo (edmx) de la base de datos con tablas.

    Y las instancias hacia la base de datos es muy simple:

    "empresaEntities1 _empleados = new empresaEntities1();"

    La implementan de SP también es muy sencilla:

     "var Insertar_NuevoEmpleado = _empleados.InsertarEmpleado(txtcedula.Text, txtnombres.Text, txtapellidos.Text, txtcargo.Text, txtdepartamento.Text, Convert.ToDecimal(txtsalario.Text), txtUrl.Text);"

    Haces el llamado a la BD y luego buscas el SP(InsertarEmpleado).

    El desarrollo de aplicaciones en c# mediante la tecnología EF, para mi es muy cómoda. Es a juicio de cada quien.


    Dave Castañeda. CCS - VENEZUELA.

    martes, 6 de marzo de 2018 14:30
  • Mientras haga using (BaseDatos conexion = new BaseDatos()), no dejará rastros en memoria.  Nótese que también debe usar using para SqlConnection.  Recuerde siempre usar using() para objetos que implementan IDisposable.  Siempre.  Y si los almacena en variables o propiedades a nivel de clase, entonces esa clase que los almacena debe implementar IDisposable.

    Ahora bien, una vez que le aclaré ese punto (espero), le comento que el objeto BaseDatos podría ser un Singleton (este es un patrón de diseño).


    Jose R. MCP
    Code Samples


    martes, 6 de marzo de 2018 16:29
    Moderador
  • Oh, no tenía idea de esa tecnología. Le echaré un viztazo. Muchas gracias.
    miércoles, 7 de marzo de 2018 20:06
  • Ah, muy bien. Otra cosa, ¿podría explicarme qué hace exactamente el using y las interfaces IDisposable? He leído precisamente que se encargan de limpiar memoria, pero no entiendo muy bien cuándo debo usarlas.

    Por otro lado, estoy manejando conexiones multiusuario, por lo que he visto que el patrón singletón no es muy efectivo o genera colisiones de datos al tener varios usuarios en una misma conexión. ¿Debería implementar otro patrón de diseño?

    Muchas gracias.

    miércoles, 7 de marzo de 2018 20:12
  • Una único objeto BaseDatos no representa una única conexión.  Su código claramente crea una nueva conexión a la base cada vez.  No debe confundir uno con otro.  Usted tiene un SQL Server con una única base de datos, ¿verdad?  Pues es lo mismo aquí:  Tiene un código que puede tener un único objeto BaseDatos que se encarga de generar múltiples conexiones.  La analogía, al menos bajo estos términos simplistas, es perfecta.

    La sentencia using es un atajo para:

    IDisposable objeto = ...;
    try
    {
        ...;
    finally
    {
        objeto.Dispose();
    }

    Ese código que le muestro es lo que DEBEMOS tener siempre que usamos objetos que implementan IDisposable.  Para no tener que escribir eso constantemente, podemos usar using().


    Jose R. MCP
    Code Samples

    miércoles, 7 de marzo de 2018 21:08
    Moderador