Поделиться через


Уведомление о выполнении асинхронной функции

В пакете SDK для Windows 8 ODBC добавил механизм уведомления приложений о завершении асинхронной операции, которую мы будем называть уведомлением о завершении. (См. раздел Дополнительные сведения об асинхронном выполнении (методе уведомления).) В этом разделе рассматриваются некоторые проблемы для разработчиков драйверов.

Интерфейс между диспетчером драйверов и драйвером

Диспетчер драйверов внутренне предоставляет функцию обратного вызова SQLAsyncNotificationCallback. SQLAsyncNotificationCallback может вызываться только драйвером. Приложение не может напрямую вызвать его. Драйвер вызывает SQLAsyncNotificationCallback всякий раз, когда новые данные, полученные от сервера после последнего возврата SQL_STILL_EXECUTING.

Диспетчер драйверов предоставляет механизм обратного вызова, поэтому драйвер может уведомить диспетчера драйверов о выполнении асинхронной операции после того, как соответствующая функция возвращает SQL_STILL_EXECUTING

Диспетчер драйверов задает атрибут SQL_ATTR_ASYNC_DBC_NOTIFICATION_CALLBACK для дескриптора подключения драйвера с указателем функции, отличной от NULL, который имеет тип SQL_ASYNC_NOTIFICATION_CALLBACK, чтобы драйвер работал в режиме уведомлений для любых асинхронных операций с этим дескриптором. Аналогичным образом диспетчер драйверов задает атрибут SQL_ATTR_ASYNC_STMT_NOTIFICATION_CALLBACK для дескриптора инструкции драйвера с указателем функции, отличной от NULL, который также имеет тип SQL_ASYNC_NOTIFICATION_CALLBACK, чтобы драйвер работал в режиме уведомлений для любых асинхронных операций с этим дескриптором.

Если асинхронная операция выполняется на дескрипторе драйвера, асинхронные функции драйвера должны работать в неблокировке. Если операция не может завершиться немедленно, функция драйвера должна вернуть SQL_STILL_EXECUTING. Это требование относится как к режиму опроса, так и к режиму уведомлений.

Если дескриптор находится в асинхронном режиме уведомления, драйвер должен вызвать функцию обратного вызова уведомлений, адрес которой является значением атрибута SQL_ATTR_ASYNC_DBC_NOTIFICATION_CALLBACK или SQL_ATTR_ASYNC_STMT_NOTIFICATION_CALLBACK, один раз после возвращения SQL_STILL_EXECUTING. Другими словами, один возвращающий SQL_STILL_EXECUTING должен быть связан с одним вызовом функции обратного вызова уведомлений. Драйвер должен использовать текущее значение атрибута SQL_ATTR_ASYNC_DBC_NOTIFICATION_CONTEXT или SQL_ATTR_ASYNC_STMT_NOTIFICATION_CONTEXT в качестве значения для параметра функции обратного вызова pContext.

Драйвер не должен вызываться в потоке, который вызывает функцию драйвера; Перед возвратом функции нет причины уведомлять о ходе выполнения. Драйвер должен использовать собственный поток для обратного вызова. Диспетчер драйверов не будет использовать поток обратного вызова драйвера для выполнения расширенной логики обработки.

Диспетчер драйверов снова вызовет исходную функцию после обратного вызова драйвера. Диспетчер драйверов может использовать поток, который не является ни потоком приложения, ни потоком драйвера. Если драйвер использует некоторые сведения, связанные с потоком (например, маркер безопасности или идентификатор пользователя), драйвер должен сохранить необходимые сведения в первоначальном асинхронном вызове и использовать сохраненное значение до завершения всей асинхронной операции. Как правило, только SQLDriver Подключение, SQL Подключение или SQLBrowse Подключение должны использовать эти сведения.

См. также

Разработка драйвера ODBC