Modulo de Conexión en Access, Ado y VB 6.0

Respuesta de
a
Usuario
Hola soy Juan Diego quería saber cómo usar un módulo para conectar con access y usando ado, tengo el siguiente código:
/*------------------------------- código del módulo-----------------------------*/
Option Explicit
Public cnnADODB As New ADODB.Connection
Public Sub conexion()
    cnnADODB.Provider = "Microsoft.Jet.OLEDB.4.0"
    cnnADODB.ConnectionString = App.Path & "\Proyecto.mdb"
    cnnADODB.Open
End Sub
/*-----------------------------código del formulario----------------------------*/
acá hago una busqueda:
Private Sub txtcodigoproveedor_KeyPress(KeyAscii As Integer)
   If KeyAscii = 13 Then
        If Me.txtcodigoproveedor.Text = "" Then
            Me.txtcodigoproveedor.SetFocus
            Me.lblcartel.Caption = "Ingrese el Código del Proveedor Para Continuar"
        Else
            Me.lblcartel.Caption = ""
            Call conexion
            Set rstproveedores = cnnADODB.Execute("Select * From proveedores where codigoproveedor=" + Me.txtcodigoproveedor + "")

            If Not rstproveedores.EOF Then
                MsgBox ("El Proveedor ya existe")
                Me.txtcodigoproveedor.Text = ""
                Me.txtcodigoproveedor.SetFocus
            Else
                Me.txtnombreproveedor.SetFocus
                Me.lblcartel.Caption = ""
            End If
        End If
    End If
End Sub
Y me da el siguiente error:
Error 3704 en tiempo de ejecución "La Operación no está permitida sí el objeto está cerrado"
Y la verdad no sé cómo arreglarlo, intenté y intenté y no lo logré, y vengo a pedirte una mano.
¿Puedes ayudarme?, sí puedes contestar este mje te lo agradeceré
Usuario
Hola soy Juan Diego quería saber cómo usar un módulo para conectar con access y usando ado, tengo el siguiente código:
/*------------------------------- código del módulo-----------------------------*/
Option Explicit
Public cnnADODB As New ADODB.Connection
Public Sub conexion()
    cnnADODB.Provider = "Microsoft.Jet.OLEDB.4.0"
    cnnADODB.ConnectionString = App.Path & "\Proyecto.mdb"
    cnnADODB.Open
End Sub
/*-----------------------------código del formulario----------------------------*/
acá hago una busqueda:
Private Sub txtcodigoproveedor_KeyPress(KeyAscii As Integer)
   If KeyAscii = 13 Then
        If Me.txtcodigoproveedor.Text = "" Then
            Me.txtcodigoproveedor.SetFocus
            Me.lblcartel.Caption = "Ingrese el Código del Proveedor Para Continuar"
        Else
            Me.lblcartel.Caption = ""
            Call conexion
            Set rstproveedores = cnnADODB.Execute("Select * From proveedores where codigoproveedor=" + Me.txtcodigoproveedor + "")

            If Not rstproveedores.EOF Then
                MsgBox ("El Proveedor ya existe")
                Me.txtcodigoproveedor.Text = ""
                Me.txtcodigoproveedor.SetFocus
            Else
                Me.txtnombreproveedor.SetFocus
                Me.lblcartel.Caption = ""
            End If
        End If
    End If
End Sub
Y me da el siguiente error:
Error 3704 en tiempo de ejecución "La Operación no está permitida sí el objeto está cerrado"
Y la verdad no sé cómo arreglarlo, intenté y intenté y no lo logré, y vengo a pedirte una mano.
¿Puedes ayudarme?, sí puedes contestar este mje te lo agradeceré
Avatar
Experto
Estimado.
Es código parece a primera impresión bien, ahora, una causa general de errores y que veo que tu también lo haces es no cerrar nunca la base de datos, es decir, el error más común en usar OPEN, pero nunca CLOSE.
 
Otra cosa es saber en que momento haces esto tu, es decir, es el primer paso de tu programa o hay algún llamado anterior a la base.
 
Otro paso es hacer un seguimiento del proceso de ejecución, poniendo una interrupción antes del llamado a Call.
 
Otra cosa que veo es que después del OPEN no pones (), si así lo tienes en tu código está mal, por que lo estás llamando para que devuelva un dato (si está abierto o no) y no para que abra la base, si lo tienes sin () en tu código entonces hazlo.
 
Si te fui de ayuda, por favor valora y cierra la pregunta, así de esa manera, puedo ayudar a más personas.
Si tienes dudas me lo haces saber.
Saludos.
Eduardo.
Usuario
Hola, perdón sí soy lento en responder es que tenía cosas que hacer digamos un php que terminar, pero sí tengo dudas la 1era es la siguiente:
Tú dices:
------------------------------------------------------------------------------------------
Es código parece a primera impresión bien, ahora, una causa general de errores y que veo que tu también lo haces es no cerrar nunca la base de datos, es decir, el error más común en usar OPEN, pero nunca CLOSE.
 
Otra cosa es saber en que momento haces esto tu, es decir, es el primer paso de tu programa o hay algún llamado anterior a la base.
Yo sin módulo abro la conexión en el form load:
/--Este es uno de los formularios de mi programa de Control de Stock de Artículos---------/
Private Sub Form_Load()
    Me.txtcodigoproveedor.Enabled = False
    Me.txtnombreproveedor.Enabled = False
    Me.txtdireccionproveedor.Enabled = False
    Me.txttelefonoproveedor.Enabled = False
    Me.cmdguardarproveedor.Enabled = False
    cnnADODB.Provider = "Microsoft.Jet.OLEDB.4.0"
    cnnADODB.ConnectionString = App.Path & "\Proyecto.mdb"
    cnnADODB.Open
End Sub
y cierro la conexion cuando hago click en el botón atrás:
/--Dentro del Mismo Formulario---------/
Private Sub cmdatras_Click()
    multiopcion = MsgBox("¿Desea volver al Menú Principal?", vbExclamation + vbYesNo, "Advertencia")
    If multiopcion = vbYes Then
        frmopciones.Show
        cnnADODB.Close
        Unload Me
    End If
End Sub
A mí se me ocurrió lo del módulo porque tengo 7 formularios y 4 de ellos hago la conexión en la BD y en el modulo hago la conexión y pongo el módulo en los formularios para que sea un poco más fácil.
Otra cosa ¿qué diferencia hay el OPEN Y CLOSE sin () y con ()?
Esas son mis dudas que quiero aclarar y encontrar respuestas, sí puedes contestar este mje te lo agradeceré
Avatar
Experto
Estimado.
Primero deberías hacer un módulo y en ese módulo hacer una función para abrir la base de datos, así puedes llamarla de cualquier formulario.
 
Si usas OPEN (sin ()) es para preguntar SI ESTA ABIERTO ENTONCES HAZ ESTO, si usas OPEN () es para decirle ABRE LA BASE DE DATOS, una devuelve el valor si está o no abierto, el otro ejecuta el comando.
 
Si te fui de ayuda, por favor valora y cierra la pregunta, así de esa manera, puedo ayudar a más personas.
Si tienes dudas me lo haces saber.
Saludos.
Eduardo.
Usuario
Hola eduardo, debo agradecerte por lo que estoy aprendiendo de conectar base de datos con módulos e intenté hacer lo que me dijiste:
/*-------------------------------------código del módulo----------------------------------------*/
Option Explicit
Public cnnADODB As New ADODB.Connection
Public Function conexion()
    cnnADODB.Provider = "Microsoft.Jet.OLEDB.4.0"
    cnnADODB.Open (App.Path & "\Proyecto.mdb")
End Function
'acá está la función hecha
/*-----------------------------------código en formulario------------------------------------*/
Private Sub txtcodigoproveedor_KeyPress(KeyAscii As Integer)
   If KeyAscii = 13 Then
        If Me.txtcodigoproveedor.Text = "" Then
            Me.txtcodigoproveedor.SetFocus
            Me.lblcartel.Caption = "Ingrese el Código del Proveedor Para Continuar"
        Else
            Me.lblcartel.Caption = ""
            Call conexion 'y acá llamo a la función
            Set rstproveedores = cnnADODB.Execute("Select * From proveedores where codigoproveedor=" + Me.txtcodigoproveedor + "")
            If Not rstproveedores.EOF Then
                MsgBox ("El Proveedor ya existe")
                Me.txtcodigoproveedor.Text = ""
                Me.txtcodigoproveedor.SetFocus
            Else
                Me.txtnombreproveedor.SetFocus
                Me.lblcartel.Caption = ""
            End If
        End If
    End If
End Sub
/*--------------------------------------------------------------------------------------------------*/
Ahora el error es al revés me dice: "La Operación no está permitida sí el objeto está abierto" y además no sé en donde poner el CLOSE con () y no sé que poner dentro del paréntesis, sí puedes contestar este mje te lo agradeceré.
Avatar
Experto
Estimado.
El Error es debido a que quieres abrir la base de datos ya estando abierta, por eso debes cerrar la conexión después de trabajar.
 
Para hacer esto haz una función igual que abrir y la llamas con CALL.
 
Public Function cerrar() 
    cnnADODB.Close()
End Function
 
Antes del End Sub pones:
Call cerrar
 
Si te fui de ayuda, por favor valora y cierra la pregunta, así de esa manera, puedo ayudar a más personas.
Si tienes dudas me lo haces saber.
Saludos.
Eduardo.