none
ExecuteReader requiere una conexión abierta y disponible RRS feed

  • Pregunta

  • Buen dia, si alguien pudiera ayudarme porfavor, lo que pasa que hice un programa en VB.net con una conexión a una base de datos en acces 2007-2016, en la computadora donde lo desarrolle si se puede ejecutar sin problema, al momento de copiar en una memoria el archivo .exe y la base de datos y ejecutarlo en otra computadora no me deja me muestra el siguiente error:
    "ExecureReader requiere una Connection abierta y disponible. El estado actual de la conexión es cerrada"  
    De ante mano agradecería mucho su ayuda.
    jueves, 7 de julio de 2016 5:13

Respuestas

  • Desde el siguiente enlace podrás descargar los componentes redistribuibles del motor Microsoft.ACE.OLEDB.12.0:

    Componente redistribuible del motor de base de datos de Microsoft Access 2010

    Para aquellos equipos que tengan una versión de Windows de 32 bits, tendrás que ejecutar el archivo AccessDatabaseEngine.exe, y para los que tengan una versión de 64 bits tendrás que ejecutar el archivo AccessDatabaseEngine_X64.exe.

    Y para que tu aplicación funcione en todos los equipos, con independencia que tengan una versión de Windows de 32 o de 64 bits, tu aplicación tienes que compilarla para Any CPU.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    viernes, 8 de julio de 2016 7:59
    Moderador
  • Hola:
    El error que te da es porque la conexion la tienes cerrada y el OleDbDataReader necesita una conexion abierta.
    ¿Puedes poner el codigo donde te da el error?

    Un saludo desde Bilbo
    Carlos
    jueves, 7 de julio de 2016 5:23
  • Te recomiendo que uses la clausula Using que te puse.

    ¿La variable CN que usas en Connect es la misma que usas en el Load?
    Sería más lógico que Connect fuera una función que devolviera un tipo OleDbConnection en lugar de manejar variables públicas.

    Function Connect() As OleDb.OleDbConnection

        Dim CN As New OleDb.OleDbConnection

        Try

            CN.ConnectionString = ("Provider = Microsoft.ACE.OLEDB.12.0;Data Source = C:\Draconia\Base de datos\Draconia.accdb")
            CN.Open()

        Catch ex As Exception
            MsgBox("Falló al conectar DB", MsgBoxStyle.Exclamation)

        Finally 
    Return CN
        End Try

    End Sub

    Y la llamada:

    Private Sub User_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Dim CN As New OleDb.OleDbConnection

        CN = Modulote.Connect()
        Using CN

            Consulta = "SELECT  *FROM Users"
            CMD = New OleDb.OleDbCommand(Consulta, CN)
            ADP.SelectCommand = CMD
            RDR = CMD.ExecuteReader
            While RDR.Read()
                CBuser.Items.Add(RDR("Nombre"))
            End While
        End Using

    End Sub


    Saludos, Javier J

    jueves, 7 de julio de 2016 8:45
  • Revisa el sitio donde abres la conexión, no vaya a ser que tenga un try...catch que permita que la ejecución siga adelante a pesar de que falle la apertura de la conexión. Esto podría ocurrir en unos PC si y en otros no, por diversas razones tales como por ejemplo diferentes permisos en disco, o diferente estructura de directorios, o diferentes drivers de OleDb (o falta de los mismos).
    viernes, 8 de julio de 2016 6:34

Todas las respuestas

  • Hola:
    El error que te da es porque la conexion la tienes cerrada y el OleDbDataReader necesita una conexion abierta.
    ¿Puedes poner el codigo donde te da el error?

    Un saludo desde Bilbo
    Carlos
    jueves, 7 de julio de 2016 5:23
  • Hola:

    Tendrías que ver si en algún procedimiento estás dejando la conexión sin abrir. Cnn.Open

    porque sin más datos es difícil saber donde puede estar el error.

    Un saludo.

    Gemma

    jueves, 7 de julio de 2016 5:24
  • hola
    no importa si ya lo revise en otras computadoras? lo que pasa que ejecute el archivo .exe en un equipo con windows 7 ademas del equipo donde lo desarrolle que tambien es windows 7 de 64 bits y en las dos se ejecuta sin problema, donde me marca el error es en equipos con windows 8.1 y windows 10 
    jueves, 7 de julio de 2016 5:40
  • Public CN As New OleDb.OleDbConnection
    este es el codigo que tengo    

    Public CMD As New OleDb.OleDbCommand
        Public ADP As New OleDb.OleDbDataAdapter
        Public RDR As OleDb.OleDbDataReader
        Public Consulta As String

        Sub Connect()
            Try
                CN.ConnectionString = ("Provider = Microsoft.ACE.OLEDB.12.0;Data Source = C:\Draconia\Base de datos\Draconia.accdb")

                CN.Open()
            Catch ex As Exception
                MsgBox("Falló al conectar DB", MsgBoxStyle.Exclamation)
            End Try
        End Sub

    Y este el es codigo en mi boton

    Consulta = "SELECT  *FROM Users"
            CMD = New OleDb.OleDbCommand(Consulta, CN)
            ADP.SelectCommand = CMD
            RDR = CMD.ExecuteReader
            While RDR.Read()
                CBuser.Items.Add(RDR("Nombre"))
            End While

    jueves, 7 de julio de 2016 5:43
  • Veo que tienes un procedimiento Connect que abre la conexión y un código al pulsar el botón que ejecuta una consulta sobre la conexión pero te falta llamar a Connect antes de ejecutar la consulta:

    Connect()

    Using CN

        Consulta = "SELECT  *FROM Users"
        CMD = New OleDb.OleDbCommand(Consulta, CN)
        ADP.SelectCommand = CMD
        RDR = CMD.ExecuteReader
        While RDR.Read()
            CBuser.Items.Add(RDR("Nombre"))
        End While

    End Using


    Saludos, Javier J

    jueves, 7 de julio de 2016 6:38
  • Perdon si de hecho si lo tengo nada mas que no lo copie sorry 

    Private Sub User_Load(sender As Object, e As EventArgs) Handles MyBase.Load

            Modulote.Connect()

            Consulta = "SELECT  *FROM Users"
            CMD = New OleDb.OleDbCommand(Consulta, CN)
            ADP.SelectCommand = CMD
            RDR = CMD.ExecuteReader
            While RDR.Read()
                CBuser.Items.Add(RDR("Nombre"))
            End While
        End Sub

           
    jueves, 7 de julio de 2016 7:16
  • Te recomiendo que uses la clausula Using que te puse.

    ¿La variable CN que usas en Connect es la misma que usas en el Load?
    Sería más lógico que Connect fuera una función que devolviera un tipo OleDbConnection en lugar de manejar variables públicas.

    Function Connect() As OleDb.OleDbConnection

        Dim CN As New OleDb.OleDbConnection

        Try

            CN.ConnectionString = ("Provider = Microsoft.ACE.OLEDB.12.0;Data Source = C:\Draconia\Base de datos\Draconia.accdb")
            CN.Open()

        Catch ex As Exception
            MsgBox("Falló al conectar DB", MsgBoxStyle.Exclamation)

        Finally 
    Return CN
        End Try

    End Sub

    Y la llamada:

    Private Sub User_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Dim CN As New OleDb.OleDbConnection

        CN = Modulote.Connect()
        Using CN

            Consulta = "SELECT  *FROM Users"
            CMD = New OleDb.OleDbCommand(Consulta, CN)
            ADP.SelectCommand = CMD
            RDR = CMD.ExecuteReader
            While RDR.Read()
                CBuser.Items.Add(RDR("Nombre"))
            End While
        End Using

    End Sub


    Saludos, Javier J

    jueves, 7 de julio de 2016 8:45
  • Que tal amigos tengo un problema, desarrolle un pequeño software con base de datos en access, el problema esta en que en algunas corre de maravilla (casualmente coincide que son windows 7) pero al intentar correrlo en otros equipos (casualmente versiones de Windows 8 y 10) falla la conexión a la base de datos con el siguiente error "executenonquery requiere una connection abierta y disponible".

    He investigado en varios foros con casos similares y preguntado en otros pero no me han dado respuesta, todos comentan que la conexión esta cerrada, pero en el código jamas se cierra, de hecho esta abierta, ademas de que eso no explica por que en algunas PC si funciona y en otras no. 

    Espero puedan ayudarme con mi problema, de antemano muchas gracias 

    viernes, 8 de julio de 2016 6:30
  • Revisa el sitio donde abres la conexión, no vaya a ser que tenga un try...catch que permita que la ejecución siga adelante a pesar de que falle la apertura de la conexión. Esto podría ocurrir en unos PC si y en otros no, por diversas razones tales como por ejemplo diferentes permisos en disco, o diferente estructura de directorios, o diferentes drivers de OleDb (o falta de los mismos).
    viernes, 8 de julio de 2016 6:34
  • Les comparto el código, el primero es el modulo que utilizo para conexión y el segundo al cargar mi primera forma, repito en ningún momento se cierra la conexión, ya intente todas las opciones que dicen en internet, pero el programa SI funciona en algunos equipos, necesito saber por que en los otros no? 

    Imports System.Data
    Imports System.Data.OleDb


    Module Modulote
        Public CN As New OleDb.OleDbConnection
        Public CMD As New OleDb.OleDbCommand
        Public ADP As New OleDb.OleDbDataAdapter
        Public RDR As OleDb.OleDbDataReader
        Public Consulta As String
        
        Public Sub Connect()
            Try
                CN.ConnectionString = ("Provider = Microsoft.ACE.OLEDB.12.0;Data Source = C:\Draconia\Base de datos\Draconia.accdb")

                CN.Open()
            Catch ex As Exception
                MsgBox("Falló al conectar DB", MsgBoxStyle.Exclamation)
            End Try
        End Sub

    End Module




      Private Sub User_Load(sender As Object, e As EventArgs) Handles MyBase.Load
           
            Connect()

            Consulta = "SELECT  *FROM Users"
            CMD = New OleDb.OleDbCommand(Consulta, CN)
            ADP.SelectCommand = CMD
            RDR = CMD.ExecuteReader

            While RDR.Read()
                CBuser.Items.Add(RDR("Nombre"))
            End While

        End Sub

    viernes, 8 de julio de 2016 6:35
  • efectivamente tengo un try catch, entonces debería borrarlo? 
    viernes, 8 de julio de 2016 6:36
  • Al borrar el Try Catch ahora me arroja otro error diferente, dice  "Microsoft.ACE.OLEDB.12.0 no esta en el equipo local
    viernes, 8 de julio de 2016 6:39
  • "Icaxag" escribió:

    > Al borrar el Try Catch ahora me arroja otro error diferente, dice
    > "Microsoft.ACE.OLEDB.12.0 no esta en el equipo local
    >
    > el programa SI funciona en algunos equipos, necesito saber por que en los otros no?

    Hola:

    Si en los equipos que obtienes el error NO tienen instalado el proveedor de datos Microsoft.ACE.OLEDB.12.0, digo yo que tendrán que instalarlo para que tu aplicación se pueda conectar a la base de datos de Access.

    ¿Esos equipos son de 32 o de 64 bits? ¿Para qué plataforma compilas tu aplicación, para x86, x64 o para Any CPU?


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    viernes, 8 de julio de 2016 6:46
    Moderador
  • Desde el siguiente enlace podrás descargar los componentes redistribuibles del motor Microsoft.ACE.OLEDB.12.0:

    Componente redistribuible del motor de base de datos de Microsoft Access 2010

    Para aquellos equipos que tengan una versión de Windows de 32 bits, tendrás que ejecutar el archivo AccessDatabaseEngine.exe, y para los que tengan una versión de 64 bits tendrás que ejecutar el archivo AccessDatabaseEngine_X64.exe.

    Y para que tu aplicación funcione en todos los equipos, con independencia que tengan una versión de Windows de 32 o de 64 bits, tu aplicación tienes que compilarla para Any CPU.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    viernes, 8 de julio de 2016 7:59
    Moderador