Principales respuestas
ExecuteReader requiere una conexión abierta y disponible

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.
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.- Marcado como respuesta Enrique M. MontejoModerator sábado, 9 de julio de 2016 14:41
-
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- Marcado como respuesta Enrique M. MontejoModerator sábado, 9 de julio de 2016 14:39
-
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?
Function Connect() As OleDb.OleDbConnection
Sería más lógico que Connect fuera una función que devolviera un tipo OleDbConnection en lugar de manejar variables públicas.
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 SubY 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 SubSaludos, Javier J
- Marcado como respuesta Enrique M. MontejoModerator sábado, 9 de julio de 2016 14:40
-
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).
- Marcado como respuesta Enrique M. MontejoModerator sábado, 9 de julio de 2016 14:41
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- Marcado como respuesta Enrique M. MontejoModerator sábado, 9 de julio de 2016 14:39
-
-
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 -
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 -
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 UsingSaludos, Javier J
-
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 -
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?
Function Connect() As OleDb.OleDbConnection
Sería más lógico que Connect fuera una función que devolviera un tipo OleDbConnection en lugar de manejar variables públicas.
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 SubY 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 SubSaludos, Javier J
- Marcado como respuesta Enrique M. MontejoModerator sábado, 9 de julio de 2016 14:40
-
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
- Combinado Enrique M. MontejoModerator viernes, 8 de julio de 2016 7:44 Preguntas relacionadas.
-
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).
- Marcado como respuesta Enrique M. MontejoModerator sábado, 9 de julio de 2016 14:41
-
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 -
-
-
"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.- Editado Enrique M. MontejoModerator viernes, 8 de julio de 2016 6:47
-
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.- Marcado como respuesta Enrique M. MontejoModerator sábado, 9 de julio de 2016 14:41