Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Cerrar Conexiones

Estas en el tema de Cerrar Conexiones en el foro de Visual Basic clásico en Foros del Web. Que tal !!! tengo el siguiente problema. Estoy haciendo un programa y trabajo con una base de datos en SQL. La cuestión es que se ...
  #1 (permalink)  
Antiguo 17/07/2008, 12:15
 
Fecha de Ingreso: julio-2008
Mensajes: 33
Antigüedad: 15 años, 9 meses
Puntos: 0
Cerrar Conexiones

Que tal !!! tengo el siguiente problema. Estoy haciendo un programa y trabajo con una base de datos en SQL. La cuestión es que se me crean muchas conexiones y al funcionar en red sería peor.

El código para la conexion que utilizo, está en la siguiente funcion de un módulo

Private cmdReal As ADODB.Command
Private rstGeneral As ADODB.Recordset

Public Function Recupera_Consulta(query As String) As ADODB.Recordset
Set cntReal = New ADODB.Connection
cntReal.CommandTimeout = 999999999
If cntReal.State = adStateClosed Then
cntReal.Open "Provider=SQLOLEDB;User Id=usuario;Pwd=contraseña;Data Source=MICOMPU;Initial Catalog=BASE_DATOS"
End If
Set rstGeneral = New ADODB.Recordset
With rstGeneral
.ActiveConnection = cntReal
.CursorLocation = adUseClient
.LockType = adLockReadOnly
.CursorType = adOpenStatic
.Open query
End With
Set Recupera_Consulta = rstGeneral.Clone
End Function

Cuando quiero hacer una consulta desde cualquier formulario (y lo hago muchas veces) simplemente hago lo siguiente

set rs=recupera_consulta("select * from empresas")


Alguien sabe como cerrar las conexiones??, que código deberia añadir para cerrarlas ????? porq solo se logran cerrar cuando salgo del proyecto. Gracias de antemano
  #2 (permalink)  
Antiguo 17/07/2008, 15:06
Avatar de Txoco  
Fecha de Ingreso: junio-2008
Ubicación: Perdido en tierras Quijotescas
Mensajes: 189
Antigüedad: 15 años, 10 meses
Puntos: 7
Respuesta: Cerrar Conexiones

Hola!

Los objetos Recordset y Connection tienen el método Close, que cierran la conexión y liberan los recursos que hubiesen reservado, y no usa parámetros.

Lo único que debes tener en cuenta es que si por cualquier razón no has inicializado un objeto de estos tipos, no podrás cerrarlo (no estaría abierto), y te saltará un error interceptable.

Lo suyo es que cuando vayas a cerrar un recordset, lo hagas de esta forma:

Código:
If Not <recordset> Is Nothing Then Call <recordset>.Close
En tu caso, puedes poner al final de tu función RecuperaConsulta:

Código:
    If Not rstGeneral Is Nothing Then Call rstGeneral.Close
    If Not cntReal Is Nothing Then Call cntReal.Close

    Set rstGeneral = Nothing
    Set cntReal = Nothing
Esto te cerrará el recordset, si se ha inicializado, y después la conexión, si también se ha inicializado. Recuerda cerrar siempre de abajo a arriba en la jerarquía (un objeto Recordset se inicializa a partir de uno Connection, si cierras primero el Connection puede darte problemas). Establecer a Nothing una variable de objeto no es necesario por lo general si se utiliza Close, pero es una buena práctica de programación indicarlo en lugar de dejárselo al compilador.

En general casi todos los objetos o procedimientos que tienen un método Open u Openloquesea, tienen el Close para finalizar su conexión y dejar el sistema limpito.

No obstante, ten en cuenta que abrir y cerrar recordsets y conexiones es un proceso muy pesado, y si haces un uso intensivo de funciones como esta, tu aplicación puede volverse muy lenta. Te aconsejo que intentes siempre reducir al máximo el número de aperturas y cierres.
  #3 (permalink)  
Antiguo 17/07/2008, 16:18
Avatar de Jhonnyf  
Fecha de Ingreso: septiembre-2007
Ubicación: Dentro de mi
Mensajes: 87
Antigüedad: 16 años, 7 meses
Puntos: 5
Respuesta: Cerrar Conexiones

no es necesario que hagas una conexion nueva por cada consulta,

Pon una variable de conexion de tipo publica en un Modulo

y en los formularios, una vez que inicies el Recorset, se la puedes pasar asi

Set rs.ActiveConnection = cn

o sino al hacer el open

rs.Open "select * from tabla",cn

y con eso solo usuarias 1 sola conexion, lo cual es lo ideal
__________________
*en construccion*
  #4 (permalink)  
Antiguo 17/07/2008, 19:01
 
Fecha de Ingreso: julio-2008
Mensajes: 33
Antigüedad: 15 años, 9 meses
Puntos: 0
De acuerdo Respuesta: Cerrar Conexiones

Gracias por sus sugerencias , las tendre encuenta y probare los que me indican.
  #5 (permalink)  
Antiguo 18/07/2008, 13:48
 
Fecha de Ingreso: julio-2008
Mensajes: 33
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Cerrar Conexiones

Cita:
Iniciado por Jhonnyf Ver Mensaje
no es necesario que hagas una conexion nueva por cada consulta,

Pon una variable de conexion de tipo publica en un Modulo

y en los formularios, una vez que inicies el Recorset, se la puedes pasar asi

Set rs.ActiveConnection = cn

o sino al hacer el open

rs.Open "select * from tabla",cn

y con eso solo usuarias 1 sola conexion, lo cual es lo ideal
Como hago lo que me indica Jhonnyf, lo estoy intentando y no lo logro. Quiero hacer eso, tener una sola conexion para el ciento de consultas que hago. Por favor ayuda. Muchas gracias
  #6 (permalink)  
Antiguo 18/07/2008, 14:55
 
Fecha de Ingreso: julio-2008
Mensajes: 33
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Cerrar Conexiones

Ya lo conseguí de este modo

en el modulo
Cita:

Public cntReal As ADODB.Connection
Public rstGeneral As ADODB.Recordset

Sub conexion()
Set cntReal = New ADODB.Connection
cntReal.CommandTimeout = 999999999
If cntReal.State = adStateClosed Then
cntReal.Open "Provider=SQLOLEDB;User Id=us;Pwd=passw;Data Source=MICOMPU;Initial Catalog=BDATOS"
End If

Public Function Recupera_Consulta(query As String) As ADODB.Recordset
Set rstGeneral = New ADODB.Recordset
With rstGeneral
.ActiveConnection = cntReal
.CursorLocation = adUseClient
.LockType = adLockReadOnly
.CursorType = adOpenStatic
.Open query
End With
Set Recupera_Consulta = rstGeneral.Clone
Y en el modulo inicial del proyecto hago un llamado a la conexion

Call conexion

y al finalizar la cierro

If cntReal .State = 1 Then cntReal .Close

De esta forma puedo hacer todas las consultas requeridas utilizando una sola conexión
Ojalá les sirva

Saludos
  #7 (permalink)  
Antiguo 18/07/2008, 15:11
 
Fecha de Ingreso: junio-2008
Mensajes: 11
Antigüedad: 15 años, 11 meses
Puntos: 0
Respuesta: Cerrar Conexiones

Bueno segun el codigo que describes usas una función de consulta, y dentro de esa funcion va una conexion nueva a la base de datos, cada vez que uses esa consulta se creará una nueva conexióna la base de tados, es como si un ususario nuevo se conectara a cada momento, lo que debes hacer es una sola conexion. yo particularmente trabajo de la siguientes manera:

Abro un nuevo modulo, que llamo conexion
dentro de el creo un procedimiemto sub main, antes de eso y fuera del procedimiento sub main declaro la siguiente variable

recuerda que si haces esto, debes decirle a vb que tu proyecto se va a inicar por el procedimiento Sub main (esto lo haces en el menu proyecto, propiedades del proyecto, objeto inicial)

Public Cn as new adodb.connetion

Sub Main()
Set Cn = New Adodb.connetion
Cn.Connecction ="Provider=SQLOLEDB;User Id=us;Pwd=passw;Data Source=MICOMPU;Initial"
Cn.Open
'Ahora lo que hago es mandar a mostrar el formulario inicial de tu programa
Form1.show

Si esta cadena de conoexio no te funciona, coloca la tuya, pero ya sabes dentro del sub main
End sub.

Ya tienes la conexion, ahora lo que debes hacer es que cuando vayas a consultar, solo declaras una variable como recordset y le asignas la cadena sql. Yo lo hago así

Dim RS As New Adodb.Recordset

Rs.Open "Select * From Mi tabla Where Campo tabla ='" & variable & "'", cn, 1,3
If not rs.eof then
insturcciones
-----
------
rs.close
else
insturcciones
------
-----
rs.close
end if

de esta manera abres la tabla que deses en el momento que deses, haces o cunsultas lo que vas a consultar y vuelves y cierras

no hay complique, es un codigo muy sencillo y muy efectivo

Saludos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:41.