Error '3705' en tiempo de ejecución : la operación no

Estimado aquí vengo con otra consulta que no puedo resolver. A ver si (como siempre) me das una mano. El problema que tengo es el siguiente:
En un modulo .Vas tengo las siguientes declaraciones de variables:
Public Const dbsR = "Base"
Public Const strDriver = "{MySQL ODBC 3.51 Driver}"
Public Const strServer = "localhost"
Public Const strUsuario = "root"
Public Const strPassward = ""
Public Const strConnect = "driver= " & strDriver & ";server=" & strServer & ";uid=" & strUsuario & ";pwd=" & strPassward & ";database=" & dbsR & ";connection="
Global rstRegistro As New ADODB.Recordset
Global Base As New ADODB.Connection
Luego creé un sub main en el cual pongo el código de apertura de la base de datos. Lo que tengo es:
Sub main()
      With Base
            .CursorLocation = adUseClient
            .Open "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security                Info=False;Initial Catalog=Base;Data Source=casa-BEDFFC6F\SQLEXPRESS"' Esta _ es    la línea que me da error '3705' en tiempo de ejecución : la operación no está permitida si el objeto está abierto.
              frmPrincipal.Show
       End With
End Sub
También tengo un procedimiento para la apertura del recordset.
Ej:
Sub Registro()
With rstRegistro
If .State = 1 Then .Close
.Open "select * from mitalbla", Base, adOpenStatic, adLockOptimistic
End With
End Sub
y. En el form _Activate del form que voy a usar el código que tengo es:
Private Sub Form_Activate()
     main
     Registro 'procedimiento
End Sub
¿Poruqué me tira ese error?

1 Respuesta

Respuesta
2
Ufff, me haz echo desempolvar mi cerebro, cuando hace que no veía VB 6.
Lo que te pasa es que ya tienes una conexión abierta, el cerrar la aplicación no te asegura cerrar las conexiones a la BD.
Lo más salomónico sería abrir solo cuando vas a usar la BD y mantenerla cerrada, algo como esto:
AbrirBD()
With rstRegistro 
If .State = 1 Then .Close 
.Open "select * from mitalbla", Base, adOpenStatic, adLockOptimistic 
End With
CerrarBD()
¿Soy Claro?.
Siempre antes de usar tu RecordSet y acceder a la BD abres la conexión, la usas en lo que tengas que usarla y cierras nuevamente.
Tampoco está demás que controles los eventos de salida y cierre de los Forms y asegurarte que la base esté cerrada.
Solucionas eso y ya no te dará error.
Estimado. Disculpá pero vuelvo sobre el tema ya que no me ha quedado claro el código.
¿En el procedimiento AbrirBD puede que esté el código para abrir el recordset en vez de la base de datos?
Hoy la verdad que no entendí muy bien el código. Cuando me dices que "ya tienes una conexión abierta, el cerrar la aplicación no te asegura cerrar las conexiones a la BD. " ¿Cómo es eso de que ya tengo la conexión abierta?
¿Podrá ser posible una explicación un poco más extensa?
Muchas gracias!
Lo que yo te puse de AbrirBD() y CerrarBD() sería el llamado a una subrutina de abrir y cerrar la base de datos y como es algo que lo llamarás una y otra vez, es bueno no repetir el código si no llamarlo cuando es necesario.
Digamos que AbrirBD es así:
Código:
Public Sub AbrirBD ()
     With Base 
            .CursorLocation = adUseClient 
            .Open "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security                Info=False;Initial Catalog=Base;Data Source=casa-BEDFFC6F\SQLEXPRESS"'
End Sub
Esto lo que hace que tu base esté abierta, las variables que uso dentro de la Sub Rutina pueden ser Globales como lo haces en tu primer ejemplo, pero debes sacar ese código del módulo .vas, es decir, cuando arranca el programa tu no abres ninguna base de datos, estás desconectado. Solo abrirás la BD cuando la vayas a usar e inmediatamente después la cierras.
En la Sub Rutina CerrarBD() solo deberías usar la instancia Close de la variable Base.
Cuando la aplicación se cierra, la que estás realizando, esta no cierra la conexión a la base de datos de forma automática, debes cerrarla tu mediante código, si no la conexión a la base de datos queda abierta y pendiente, entonces tu al intentar abrirla nuevamente te salta el error que mencionas, debido a que tu ya tienes abierta una conexión a esa base y ahí está el problema.
Con todo el código anterior lo que pretendemos es estar cerrados siempre y cuando necesitamos abrimos, sacamos, asentamos, borramos o lo que tengamos que hacer y cerramos la conexión inmediatamente después de terminar.
Eso nos asegura que no gastamos recursos en vano, que dejamos libre al servidor para atender otras llamadas y todos trabajan más holgados, es por eso que en .NET la idea de ADO.NET es esa, trabajar desconectado. Es un poco eso lo que yo quiero trasmitirte a ti.
Recuerda, que si el Recordset está abierto o la BD está abierta, el intentar abrirla nuevamente da como resultado ERROR.
Como siempre te dejo algo de material para leer de algunas personas que han tenido tus problemas.
Link:
http://www.forosdelweb.com/f69/cerrar-conexiones-606841/
Si tienes dudas me lo haces saber.
Estimado: La verdad que no lo chequeé al código pero vuelvo a repetir: Estoy totalmente agradecido por tu interés y por lo rápido de tus respuestas.
dim excelente as integer
         for excelente = 1 to 1000 do
              msgbox "Lo suyo es extraordinario", vbExclamation, "Profesional al servicio de la gente" 
        next excelente
Siga así amigo que cosechará muchos fans!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas