Notificación de finalización asincrónica (función)

En el SDK de Windows 8, ODBC agregó un mecanismo para notificar a las aplicaciones cuando se complete una operación asincrónica, a la que nos referiremos como "notificación al finalizar". (Para obtener más información, vea Ejecución asincrónica (método de notificación)). En este tema se describen algunos de los problemas para los desarrolladores de controladores.

Interfaz entre el Administrador de controladores y el controlador

El Administrador de controladores proporciona internamente una función de devolución de llamada SQLAsyncNotificationCallback. El controlador solo puede llamar a SQLAsyncNotificationCallback: una aplicación no puede llamarla directamente. El controlador llama a SQLAsyncNotificationCallback cada vez hay nuevos datos recibidos del servidor después de devolver SQL_STILL_EXECUTING por última vez.

El Administrador de controladores proporciona un mecanismo de devolución de llamada para que un controlador pueda notificar al Administrador de controladores cuando se haya realizado algún progreso en la ejecución de una operación asincrónica después de que la función correspondiente devuelva SQL_STILL_EXECUTING

El Administrador de controladores establece el atributo SQL_ATTR_ASYNC_DBC_NOTIFICATION_CALLBACK en un identificador de conexión de controlador con un puntero de función que no es NULL, es de tipo SQL_ASYNC_NOTIFICATION_CALLBACK, para que el controlador funcione en modo de notificación para las operaciones asincrónicas en ese identificador. Del mismo modo, el Administrador de controladores establece el atributo SQL_ATTR_ASYNC_STMT_NOTIFICATION_CALLBACK en un identificador de instrucción de controlador con un puntero de función que no es NULL, que también es de tipo SQL_ASYNC_NOTIFICATION_CALLBACK, para que el controlador funcione en modo de notificación para las operaciones asincrónicas en ese identificador.

Si se realiza una operación asincrónica en un controlador, las funciones de controlador asincrónicas deben funcionar en un estilo de no bloqueo. Si la operación no se puede completar inmediatamente, la función del controlador debe devolver SQL_STILL_EXECUTING. Este requisito se aplica al modo de sondeo y al modo de notificación.

Si un identificador está en modo asincrónico de notificación, el controlador debe llamar a la función de devolución de llamada de notificación, cuya dirección es el valor del atributo SQL_ATTR_ASYNC_DBC_NOTIFICATION_CALLBACK o SQL_ATTR_ASYNC_STMT_NOTIFICATION_CALLBACK, una vez después de devolver SQL_STILL_EXECUTING. En otras palabras, se debe emparejar un SQL_STILL_EXECUTING devuelto con una invocación de la función de devolución de llamada de notificación. El controlador debe usar el valor actual del atributo identificador SQL_ATTR_ASYNC_DBC_NOTIFICATION_CONTEXT o SQL_ATTR_ASYNC_STMT_NOTIFICATION_CONTEXT como valor para el parámetro de función de devolución de llamada pContext.

El controlador no debe volver a llamar al subproceso que llama a la función del controlador; no hay ninguna razón para notificar el progreso antes de que se devuelva la función. El controlador debe usar su propio subproceso para la devolución de llamada. El Administrador de controladores no usará el subproceso de devolución de llamada del controlador para ejecutar una lógica de procesamiento extensa.

El Administrador de controladores volverá a llamar a la función original después de que el controlador vuelva a llamar. El Administrador de controladores puede usar un subproceso que no sea un subproceso de aplicación ni un subproceso de controlador. Si el controlador usa cierta información asociada al subproceso (por ejemplo, token de seguridad o identificador de usuario), el controlador debe guardar la información necesaria en la llamada asincrónica inicial y usar el valor guardado antes de que se complete toda la operación asincrónica. Normalmente, solo SQLDriver Conectar, SQL Conectar o SQLBrowse Conectar necesitan usar ese tipo de información.

Consulte también

Desarrollar un controlador ODBC