none
Unica conexion a sql en toda la aplicacion RRS feed

  • Pregunta

  • Hola foro he estado creando aplicaciones con conexion a base de datos hasta ahora en cada form hago una conexion distinta de este modo:

     Dim con As New SqlConnection("Data Source=GUAJIRO;Initial Catalog=BasePractica;User ID=guajiro;Password=guajiro27")

    viendo otras aplicaciones veo que se llama la conexion en cada formulario de una clase, mi pregunta: ¿que es mejor abrir varias conexciones una por cada form o tener una declarada en una clase y de ahi llamarla a los forms?

    miércoles, 1 de mayo de 2013 15:25

Respuestas

  • ¿que es mejor abrir varias conexciones una por cada form o tener una declarada en una clase y de ahi llamarla a los forms?

    no crees ninguna clase de manejo de conexiones porque eso es para problemas

    deja que ado.net se encargue del tema

    cuando usas

    Using cn As New MySqlConnection(ConfigurationManager.ConnectionStrings("default").ToString())

       //resto codigo

    End Using

    esto hace que al terminar de usar la conexion esta se destruya

    pero ado.net mantiene internamente un pool de conexion que hace que no se cierre del todo por lo que si a continuacion abre otra no estas creando un nuevo objeto sino que reutilizas uno existente

    deja que ado.net se encargue y tu crea uan capa de datos

    [WinForms] Edición Empleados

    solo que en tu caso usarias ado.net para mysql

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta juvifra86 martes, 7 de mayo de 2013 0:35
    miércoles, 1 de mayo de 2013 16:17

Todas las respuestas

  • Hola.

    Lo ideal es que te conectes ala base de datos cuando vas a ejecutar una accion. 

     ¿que es mejor abrir varias conexciones una por cada form o tener una declarada en una clase y de ahi llamarla a los forms?

    Lógicamente no es Recomendable abrir varias conexiones. Podrias tener una clase que devuelva el objeto Conexion y usarla cuando vas  a tener un acceso a la base de datos.


    Luis Muñoz Hidalgo
    Mi Blog
    Desarrollador de Software
    Trujillo-Perú

    miércoles, 1 de mayo de 2013 15:32
  • Lo puedes usar de esta manera, creas un archivo app.config 

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <connectionStrings>
        <add name="default" connectionString="server=localhost;User Id=root;database=prueba;pwd=123" />
      </connectionStrings>
    </configuration>

    Luego una clase para tu conexion

    Imports MySql.Data
    Imports MySql.Data.MySqlClient
    Imports System.Configuration
    
    Public Class Conexión
        Public Shared Function Conectar(ByVal connString As String) As MySqlConnection
            Try
                Dim conn As String = ConfigurationManager.ConnectionStrings("default").ToString
                Dim cs As New MySqlConnection(conn)
                Return cs
            Catch ex As Exception
                Throw New ArgumentException("Error al conectar", ex)
            End Try
            Return Nothing
        End Function
    End Class

    Y lo usas de esta manera

    Public Sub Agregar(ByVal cliente As E.Cliente)
            Using cn As MySqlConnection = Conexión.Conectar("default") ==> Uso de conexión
                cn.Open()
                Using cmd As MySqlCommand = cn.CreateCommand
                    cmd.CommandText = "USP_AgregarCliente"
                    cmd.CommandType = CommandType.StoredProcedure
                    With cmd.Parameters
                        .Add("_nombre", MySqlDbType.VarChar, 80).Value = cliente.Nombre
                        .Add("_direccion", MySqlDbType.VarChar, 80).Value = cliente.Direccion
                        .Add("_ciudad", MySqlDbType.VarChar, 80).Value = cliente.Ciudad
                        .Add("_telefono", MySqlDbType.VarChar, 9).Value = cliente.Telefono
                    End With
                    cmd.ExecuteNonQuery()
                    'Return String.Empty
                End Using
            End Using
        End Sub

    Archivos de Configuración - Una introducción (1/3) Acá tienes una buena guía.

    Es mejor tenerlo en una clase y desde allí solo lo llamas al método y te evitas estar escribiendo la conexión en cada lado que lo vas a usar.


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú



    miércoles, 1 de mayo de 2013 15:35
  • ¿que es mejor abrir varias conexciones una por cada form o tener una declarada en una clase y de ahi llamarla a los forms?

    no crees ninguna clase de manejo de conexiones porque eso es para problemas

    deja que ado.net se encargue del tema

    cuando usas

    Using cn As New MySqlConnection(ConfigurationManager.ConnectionStrings("default").ToString())

       //resto codigo

    End Using

    esto hace que al terminar de usar la conexion esta se destruya

    pero ado.net mantiene internamente un pool de conexion que hace que no se cierre del todo por lo que si a continuacion abre otra no estas creando un nuevo objeto sino que reutilizas uno existente

    deja que ado.net se encargue y tu crea uan capa de datos

    [WinForms] Edición Empleados

    solo que en tu caso usarias ado.net para mysql

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta juvifra86 martes, 7 de mayo de 2013 0:35
    miércoles, 1 de mayo de 2013 16:17
  • Leandro Tuttini escribió:

    no crees ninguna clase de manejo de conexiones porque eso es para problemas.

    Pero por Dios, porque dices que trae problemas., si das motivos y explicaciones coherentes porfavor, porque el crear un metodo que te retorne el Objeto Conexion es malo.

    Perfectamente pueds tener un metodo que te retorne la conexion y usarlo dentro de un bloque Using para que la conexion se destruya.

    Es mas he visto que en los ejemplo de Leandor en cada metodo hace los sigueinte

     Using cn as new ....

    en otro metodo igual

    Using cn as new ....

    Me parece que es repetir codigo, porque no tener un metodo que te retorne la conexion y que se destruya.. el codigo quedaria mas prolijo en lugar que a cada rato instancias la conexion.


    Luis Muñoz Hidalgo
    Mi Blog
    Desarrollador de Software
    Trujillo-Perú

    miércoles, 1 de mayo de 2013 16:29
  • Pero por Dios, porque dices que trae problemas., si das motivos y explicaciones coherentes porfavor, porque el crear un metodo que te retorne el Objeto Conexion es malo.

    porque he visto que empiezan definiendo la conexion y despues va creciendo y creciendo en metodo que ejecutan una query, cargan un dataset ,etc

    y se hace una bola de codigo que tenia por objetivo ayudar y terminan en una ensalada de codigo que encima por supeusto no suan parametros en nada

    por eso para cortar esa idea de raiz es que ninguan clase que ayude

    si se quiere suar una que se implemente Data Access Application Block

    Me parece que es repetir codigo, porque no tener un metodo que te retorne la conexion y que se destruya.

    si te parece que una linea sola, o sea esta

    Using cn As New MySqlConnection(ConfigurationManager.ConnectionStrings("default").ToString())

    es reptir codigo, no el veo el sentido de crear una clase por una sola linea

    vuelvo a repitir ninguan clase para solo administrar la coenxion a los datos, es una pesima idea

    deidca el tiempo a cosas verdaderamente importantes, implementa Repository o una capa de datos de verdad, pero no una clase como la que estas pensando crear

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina


    miércoles, 1 de mayo de 2013 16:39
  • Una cosa es que se cree métodos genéricos para ejecutar comandos para cargar un dataset. Esto de aca esta mal pero muy mal.. no lo usaria nunca.

    Y otra muy diferente es que se cree un método para la conexión. Esto me parece correcto.



    Luis Muñoz Hidalgo
    Mi Blog
    Desarrollador de Software
    Trujillo-Perú

    miércoles, 1 de mayo de 2013 16:43
  • Una cosa es que se cree métodos genéricos para ejecutar comandos para cargar un dataset. Esto de aca esta mal pero muy mal.. no lo usaria nunca.

    el tema es que tu lo sabes, yo lo se

    pero quien recien comienza en programacion no lo sabes y es muy frecuente, y lo he visto, que empiece con una clase simple que devuelva la conexion y se vuelva un monstruo que ya sabe dios cuantos metodo para "ayudar" tiene

    es por eso que mi recomendacion es cortar de raiz la idea, por eso no lo recomiendo


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    miércoles, 1 de mayo de 2013 16:48
  • Hasta cierto punto e doy la razon. 

    Pero bueno es respetable cada punto de vista.

    Saludops


    Luis Muñoz Hidalgo
    Mi Blog
    Desarrollador de Software
    Trujillo-Perú

    miércoles, 1 de mayo de 2013 16:51