Programa en VB se bloquea mientras se ejecuta una busqueda SQL
Estoy haciendo un programa en VB.NET que hace una conexion con una base de datos de access, y ejecuta busquedas sobre ella mediante SQL.
El problema que tengo es que cuando realizo una busqueda mediante el comando Execute que proporciona muchos datos el programa se me queda totalmente bloqueado hasta que finaliza la busqueda.
Necesito que me digais alguna forma por la que no se quede bloqueado mientras hace la busqueda. Por supuesto con el DoEvents() no se consigue nada.
Un saludo y gracias por adelantado.
El problema que tengo es que cuando realizo una busqueda mediante el comando Execute que proporciona muchos datos el programa se me queda totalmente bloqueado hasta que finaliza la busqueda.
Necesito que me digais alguna forma por la que no se quede bloqueado mientras hace la busqueda. Por supuesto con el DoEvents() no se consigue nada.
Un saludo y gracias por adelantado.
Creo que no queda otra solución que "aguantar" esas esperas, ya que el motor de bases de datos está ejecutando una orden que se le ha enviado. Lo único que se me ocurre es que intentes optimizar las consultas al máximo.
Saludos y felices fiestas.
Saludos y felices fiestas.
Muchas gracias por tu respuesta Baltasar, habrá que aguantarse, jeje.
Felices Fiestas a ti tambien. Saludos.
Felices Fiestas a ti tambien. Saludos.
Tambien tienes la opción de ejecutar la sentencia de forma asincronar y esperar a que termine la sentencia para recupar los valores. Esto provoca la devolución inmediata a la siguiente linea de visual. Puedes buscar en la MSDN sobre la utilización de ADO en este formato.
Basicamente es lo siguiente:
Tienes que declarar una cadena de conexion ADO con eventos
Public WithEvents a As ADODB.Connection
A continuacion ejecutar la sentencia, añadiendo la opcion async
oConn.Execute "SQL", , adAsyncConnect
Esto devolvera el control inmediatamente pero no obtendras la respuesta en ese metodo sino que el recordset lo puedes encontrar en el evento de la conexion
Private Sub a_ExecuteComplete(ByVal RecordsAffected As Long, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pCommand As ADODB.Command, ByVal pRecordset As ADODB.Recordset, ByVal pConnection As ADODB.Connection)
End Sub
En ese evento tienes los objetos cargados una vez se ha completado la petición a la base de datos
Revisa la documentación sobre los demas eventos y ten cuidado con las variables globales que utilizas.
Un saludo
Basicamente es lo siguiente:
Tienes que declarar una cadena de conexion ADO con eventos
Public WithEvents a As ADODB.Connection
A continuacion ejecutar la sentencia, añadiendo la opcion async
oConn.Execute "SQL", , adAsyncConnect
Esto devolvera el control inmediatamente pero no obtendras la respuesta en ese metodo sino que el recordset lo puedes encontrar en el evento de la conexion
Private Sub a_ExecuteComplete(ByVal RecordsAffected As Long, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pCommand As ADODB.Command, ByVal pRecordset As ADODB.Recordset, ByVal pConnection As ADODB.Connection)
End Sub
En ese evento tienes los objetos cargados una vez se ha completado la petición a la base de datos
Revisa la documentación sobre los demas eventos y ten cuidado con las variables globales que utilizas.
Un saludo
Posteo de nuevo para confirmar que funciona correctamente y para comentar que si se usa en .NET el Sub correcto es el siguiente:
Private Sub objConnBus_ExecuteComplete(ByVal RecordsAffected As Integer, ByVal pError As ADODB.Error, ByRef adStatus As ADODB.EventStatusEnum, ByVal pCommand As ADODB.Command, ByVal pRecordset As ADODB.Recordset, ByVal pConnection As ADODB.Connection) Handles objConnBus.ExecuteComplete
End Sub
Simplmente faltaba el Handles del final, aunque no hace falta copiar esto ya que el .NET te lo pone automáticamente al seleccionar el evento ExecuteComplete del ADODB.Connectio que tienes declarado, para poder ser editado.
Un saludo.
Private Sub objConnBus_ExecuteComplete(ByVal RecordsAffected As Integer, ByVal pError As ADODB.Error, ByRef adStatus As ADODB.EventStatusEnum, ByVal pCommand As ADODB.Command, ByVal pRecordset As ADODB.Recordset, ByVal pConnection As ADODB.Connection) Handles objConnBus.ExecuteComplete
End Sub
Simplmente faltaba el Handles del final, aunque no hace falta copiar esto ya que el .NET te lo pone automáticamente al seleccionar el evento ExecuteComplete del ADODB.Connectio que tienes declarado, para poder ser editado.
Un saludo.
