He estado a pregunte y pregunte cosas por un sistema que estoy desarrollando y hoy surgio un detalle grave a mi parecer que no tome en cuenta y que aunque hay forma de solucionar con un "parche", haria que cambie casi todo el codigo del sistema y el sistema esta casi terminado.
El problema que tengo es que no cierro las conexiones que hago al hacer alguna consulta, así sea de select, insert, etc. En si el problema lo veo con los selects al moverse de un renglon a otro en un datagridview que hace una consulta cada vez que se pasa de renglon.
Estoy usando el patron visitor y no encuentro como cerrar cada conexion que se va abriendo, despues de obtener la informacion de la base de datos pues si cierro la conexion en funcion Visit (del patron visitor) despues de asignar un datareader a mi objeto, ya no me permite usarlo.
Esto es un pedazo del codigo del visit y del boton donde se hace la visita:
metodo Visit
Código C++:
Si debajo de la ultima linea cierro la conexion ya no me deja trabajar con el lectorVer original
Public Overrides Sub Visit(ByVal objArticulos As Clase_Articulos) Dim datosarticulo As String() = objArticulos.DatosArticulo Try _oManejador.AbrirConexion() _oManejador.Conexion.Open() Select Case objArticulos.Opc Case 3 _oManejador.Consulta = "SELECT AR.* FROM articulos AS AR, categorias AS CT, articulos_categorias AS AC WHERE CT.ct_nombre='" + datosarticulo(0) + "' AND AR.ar_id=AC.ar_id AND CT.ct_id=AC.ct_id and AR.ar_id>" + datosarticulo(1) + " LIMIT 2;" _oManejador.EjecutaConsulta() objArticulos.Lector = _oManejador.Lector end sub
Este es el codigo del evento que en teoria usarian muchos los usuarios y que por consiguiente me causa el problema de limite de conexiones superadas.
Código C++:
Ver original
Private Sub DGArticulo_KeyUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles DGArticulo.KeyUp If e.KeyValue = 40 Then If DGArticulo.CurrentRow.Index = DGArticulo.Rows.Count - 1 Then Dim datosarticulo As String() _oArticulo = New Clase_Articulos If CBFiltroCategoria.SelectedIndex = 0 Or CBFiltroCategoria.SelectedIndex = -1 Then _oArticulo.Opc = 17 ReDim datosarticulo(0) datosarticulo(0) = DGArticulo.Item(0, DGArticulo.CurrentRow.Index).Value Else _oArticulo.Opc = 3 ReDim datosarticulo(1) datosarticulo(0) = CBFiltroCategoria.SelectedItem datosarticulo(1) = DGArticulo.Item(0, DGArticulo.CurrentRow.Index).Value End If _oArticulo.DatosArticulo = datosarticulo Dim _oElem As Elemento _oElem = _oArticulo Dim Consulta As Visitor = New VisitanteConsulta() _oElem.Accept(Consulta) Lector = _oArticulo.Lector While Lector.Read() DGArticulo.Rows.Add(Lector("ar_id").ToString(), Lector("ar_codigoarticulo").ToString(), Lector("ar_nombre").ToString(), Lector("ar_descripcion").ToString()) End While End If End If End Sub
Se que el codigo no es el mas optimizado ni mejor pensado, aun asi, espero me puedan ayudar y que los cambios que tenga que hacer no sean muchos por que enserio, el sistema es muy grande.