异步函数完成通知

在 Windows 8 SDK 中,ODBC 添加了一种机制,用于在异步操作完成时通知应用程序,我们将将其称为“完成时通知”。 (有关详细信息,请参阅异步执行(通知方法)。) 本主题讨论驱动程序开发人员的一些问题。

驱动程序管理器和驱动程序之间的接口

驱动程序管理器在内部提供回调函数 SQLAsyncNotificationCallback 函数SQLAsyncNotificationCallback 只能由驱动程序调用 - 应用程序无法直接调用它。 在最后一次返回 SQL_STILL_EXECUTING 后,每当从服务器收到新数据时,驱动程序都会调用 SQLAsyncNotificationCallback

驱动程序管理器提供回调机制,以便在相应函数返回 SQL_STILL_EXECUTING 后执行异步操作取得一定进展时,驱动程序可以通知驱动程序管理器。

驱动程序管理器使用非 NULL 函数指针(类型为 SQL_ASYNC_NOTIFICATION_CALLBACK)在驱动程序连接句柄上设置 SQL_ATTR_ASYNC_DBC_NOTIFICATION_CALLBACK 属性,以便驱动程序在该句柄上执行任何异步操作的通知模式。 同样,驱动程序管理器使用非 NULL 函数指针(类型同样为 SQL_ASYNC_NOTIFICATION_CALLBACK)在驱动程序语句句柄上设置 SQL_ATTR_ASYNC_STMT_NOTIFICATION_CALLBACK 属性,以便驱动程序在该句柄上执行任何异步操作的通知模式。

如果在驱动程序句柄上执行异步操作,异步驱动程序函数应以非阻塞样式工作。 如果操作无法立即完成,驱动程序函数应返回 SQL_STILL_EXECUTING。 此要求适用于于轮询模式和通知模式。

如果句柄处于通知异步模式,驱动程序必须在返回 SQL_STILL_EXECUTING 后调用通知回调函数(其地址是 SQL_ATTR_ASYNC_DBC_NOTIFICATION_CALLBACK 或 SQL_ATTR_ASYNC_STMT_NOTIFICATION_CALLBACK 属性的值)。 换句话说,一个返回 SQL_STILL_EXECUTING 必须与通知回调函数的一个调用配对。 驱动程序应使用 SQL_ATTR_ASYNC_DBC_NOTIFICATION_CONTEXT 或 SQL_ATTR_ASYNC_STMT_NOTIFICATION_CONTEXT 句柄属性的当前值作为回调函数参数 pContext 的值。

驱动程序不得在调用驱动程序函数的线程中回调;在函数返回之前,不应通知进度。 驱动程序应使用自己的线程进行回调。 驱动程序管理器不会使用驱动程序的回调线程来执行广泛的处理逻辑。

驱动程序管理器将在驱动程序回调后再次调用原始函数。 驱动程序管理器可以使用既不是应用程序线程也不是驱动程序线程的线程。 如果驱动程序使用与线程关联的某些信息(例如安全令牌或用户标识符),驱动程序应在初始异步调用中保存所需的信息,并在整个异步操作完成之前使用保存的值。 通常,只有 SQLDriverConnect、SQLConnect 或 SQLBrowseConnect 才需要使用这类信息。

另请参阅

开发 ODBC 驱动程序