Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: luison en 14 Febrero 2011, 18:09 pm



Título: Cómo mantener conexion abierta a MySQL?
Publicado por: luison en 14 Febrero 2011, 18:09 pm
Que tal salu2 y feliz dia!

Veran, tengo una conexion a mysql que es la siguiente:

Código
  1. Public Sub ConexionMySQL()
  2.        Try
  3.  
  4.            If CellDBCon.State = ConnectionState.Closed Then
  5.  
  6.                CellDBCon.ConnectionString = "Server=" & Trim(pStrServer) & "; port=" & Trim(pStrPort) & "; Uid=" & Trim(pStrUser) & "; Pwd=" & Trim(pStrPW) & "; database=" & Trim(pStrDB) & ";"
  7.                CellDBCon.Open()
  8.  
  9.            End If
  10.        Catch ex As Exception
  11.  
  12.        End Try
  13.  
  14.        MsgBox("Error al establecer la conmexion con el Servidor de Base de Datos" & vbCrLf & Err.Description)
  15.    End Sub
  16.  

La cual utiizo de la siguiente manera, como ejemplo:

Código
  1. Dim item As ListViewItem
  2.        Dim cmd As New MySqlCommand
  3.        Dim reader As MySqlDataReader
  4.  
  5.        CerrarConexion()
  6.        ConexionMySQL()
  7.        Try
  8.            cmd.Connection = CellDBCon
  9.            cmd.CommandText = "SELECT * from horarios"
  10.            reader = cmd.ExecuteReader
  11.            lstLista.Items.Clear()
  12.            While reader.Read
  13.  
  14.                item = lstLista.Items.Add(reader(0).ToString)
  15.                item.SubItems.Add(reader(1).ToString)
  16.  
  17.  
  18.            End While
  19.        Catch ex As MySqlException
  20.            MsgBox("Error: " & ex.Message & vbNewLine, MsgBoxStyle.Exclamation)
  21.        End Try
  22.        CerrarConexion()
  23.  


Cada vez que lleno un combo, listview etx, tengo que abrir y cerrar la conexion.
De otra manera e intentado abrir la conexion en el load de los formularios para mantenerla siempre abierta, pero en ocasiones da un error de que ya hay una instancia de la conexion abierta.

Alguien que me pueda echar un cable de cómo puedo mantener la conexion siempre abierta sin tener que estar abriendo y cerrandola?

La idea es abrirla en los loads de los forms, o en unaa funcion main y cerrarla unicamente al cerrar la aplicacion.( cosa que hacia en el vb6  :) )

Gracias y estarémos por aqui investigando alternativas.



Título: Re: Cómo mantener conexion abierta a MySQL?
Publicado por: [D4N93R] en 14 Febrero 2011, 20:39 pm
Pues deja como lo hacías pero solo comprueba que si se cierra la abres de nuevo y ya.

Aunque es mejor cerrarla siempre porque evita cargas innecesarias contra el servidor de base de datos.

Además se te cierra probablemente porque el Garbage Collector lo está haciendo.

Intenta poner eso en donde haces la conexión:
Código
  1. GC.KeepAlive(CellDBCon);
  2.  

Un saludo.


Título: Re: Cómo mantener conexion abierta a MySQL?
Publicado por: seba123neo en 15 Febrero 2011, 04:36 am
Hola, yo nunca tuve problema en esto de las conexiones, siempre la mantuve abierta, pero nunca la habras en los formularios, lo podes abrir una sola vez en un modulo con el Sub_Main(), tenes que agregar un modulo simple y ahi crear el Sub_Main() y ahi conectarte, en las propiedad es del proyecto debes cambiar que el objeto de inicio sea el Sub_Main() y no el formulario.

otra cosa es que en esto de los temas de bases de datos, es mejor crear clases con metodos que traigan los resultados, asi en el formulario no haces las consultas, esto seria como programar en 3 capas digamos, pero bueno eso depende de cada uno.

saludos.


Título: Re: Cómo mantener conexion abierta a MySQL?
Publicado por: luison en 15 Febrero 2011, 19:40 pm
Ok gracias a los dos. Voy a probar la forma que me sugieres seba.
Enseguida posteo los resultados.


Título: Re: Cómo mantener conexion abierta a MySQL?
Publicado por: [D4N93R] en 15 Febrero 2011, 21:06 pm
Si, como dice seba está bien, pero recuerda validad que si la conexión se cierra volverla a abrir, solo para evitar problemas.

Esto lo puedes hacer en una propiedad static (shared en vb.net) en el Sub_main como dice seba.

Un saludo.