Programa en VB se bloquea mientras se ejecuta una busqueda SQL

reventador
22 de Diciembre del 2003
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.

Baltasar
22 de Diciembre del 2003
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.

reventador
22 de Diciembre del 2003
Muchas gracias por tu respuesta Baltasar, habrá que aguantarse, jeje.

Felices Fiestas a ti tambien. Saludos.

Jorge
22 de Diciembre del 2003
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

reventador
22 de Diciembre del 2003
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.

reventador
22 de Diciembre del 2003
Gracias Jorge, estoy probándolo y tiene buena pinta. Lo único es que el adAsyncConnect en .NET hay que ponerlo así:

ADODB.ConnectOptionEnum.adAsyncConnect

Pero salvo esa nimiedad el resto está todo correcto, de nuevo muchas gracias y felices fiestas!