Resumen Consulta asíncrona con ADO   (2 mensajes )

Mensaje enviado por Sergio Daniel Galván <sergioreport@fibertel.com.ar>

Claudio:

De acuerdo a la documentación de Microsoft Press para el caso de Consultas SQL que no devuelvan un RecordSet, por ejemplo si se utiliza adExecuteNoRecords como parámetro al iniciar el RecordSet, el objeto pRecordset queda en Nothing.

Pero inclusive en este caso, para consultas asincrónicas, el objeto Recordset va a quedar en adStateOpen + adStateFetching, mientras esté ejecutando la consulta y cuando termine se dispara el evento FetchComplete.
Para el caso de un RecordSet en que no se devuelva registros la propiedad State queda en adStateClose una vez terminada la Consulta, para el caso de devolución de datos cambia a adStateOpen.

Esto es la teoría, la verdad es que para "Consultas de Acción" ni se me había ocurrido la posibilidad de utilizar ADO en modo asicrónico.

                Saludos

Sergio Daniel Galván
Report System


Destinatarios: vb-esp@ccc.uba.ar
CC: (cci: Claudio Bermudez/HUI/UPS/YPF S.A.)
Asunto: RE: vb-esp : Duda


JGA:

Los diseñadores del Motor ADO incluyeron la posibilidad de ejecutar una "Consulta Asincrónica" a una Base de Datos, para tal motivo incluyeron en el Modelo los Eventos FetchComplete y FetchProgress. El Evento FetchComplete dispone de tres Parámetros: pError, adStatus y pRecordset; y el último evento tiene cuatro Parámetros: Progress, MaxProgress, adStatus y pRecordset.

Los Parámetros Progress y MaxProgress está diseñados para inclusive mostrar barras de Evolución, pero, siempre hay un pero, por lo menos hasta ADO 2.5 sólo "devuelven" los valores Cero mientras se está procesando y Uno cuando terminó.

El CursorLocation del RecorddSet debe estar en adUseClient, pero por más que juegues con las propiedades Fetch Size y Background Fetch Size no vas a poder obtener información sobre el progreso de la Consulta como originalmente lo había planeado el equipo de desarrollo de ADO.

De acuerdo a la documentación de Microsoft Press los dos Eventos se disparan cuando la Consulta obtuvo el número de Registros específicado en la propiedad Initial Fetch Size, y no cuando se obtuvieron menos datos.
Mientras ADO tenga más datos para devolver está en adStateOpen + adStateFetching, cuando terminó se dispara el evento FetchComplete.

Si pensas poner un Gif "Actuando" mientras dure la consulta te va a servir. No me he fijado si la gente de ADo modificó estas características con la versión 2.6 de modo que te permitan ir obteniendo un % del progreso de la Consulta SQL como lo tenían planeado originalmente.

        Suerte

Sergio Daniel Galván
Report System

Mensaje enviado por "Ignacio Napal" <inapal@equiplus.com>


En primer lugar tenés que declarar el RecordSet con "withevents". De esta manera, mientras la consulta se está ejecutando, se van disparando diferentes eventos sobre el Recordset.
Además, cuando se abre el recordset, se le indica (mediante un parámetro) que debe operar en forma asíncrona.

Supongamos que tenemos un objeto "cn" de tipo ADODB.Connection ya abierto, y que hay que leer una consulta muy larga. Podría quedar algo así:

Dim WithEvents rs As ADODB.Recordset

    AborQry = False
    Set rs = New ADODB.Recordset
    rs.CursorLocation = adUseClient
    rs.Open "Select * From Clientes", cn, adOpenKeyset, adLockReadOnly, adAsyncExecute + adAsyncFetch
    Do While (rs.State And adStateExecuting) = adStateExecuting Or _
             (rs.State And adStateFetching) = adStateFetching

        'Verifica si se aborta la consulta
        DoEvents
        If AbortQry Then
            rs.Cancel
        End If
    Loop

"AbortQry" es una variable booleana global al módulo, que es puesta a "False" al iniciar el ciclo de lectura, y que puede ser puesta a "True" en el evento Click de un boton "Detener". El "DoEvents" dentro del ciclo "Do...Loop" hace funcionar ese botón, y cancela la consulta con el método "rs.Cancel" si se lo presiona.

Además, te van a aparecer varios eventos relacionados con el recordset "rs". (Por ejemplo "rs_FetchProgress"). En ellos podés hacer los controles que necesites sobre el proceso de lectura. Fijate los parámetros disponibles en c/u.

Ignacio Napal
Equiplus S.A.
email: inapal@equiplus.com



Resumen Resumen

Visual Basic Página de Visual Basic

Página principal Página principal

www.jrubi.com