在 Windows 8 SDK 中,ODBC 添加了一种机制,用于在异步作完成时通知应用程序,我们将将其称为“完成通知”。 (有关详细信息 ,请参阅异步执行(通知方法 )。 本主题讨论驱动程序开发人员的一些问题。
驱动程序管理器和驱动程序之间的接口
驱动程序管理器在内部提供回调函数 SQLAsyncNotificationCallback 函数。 SQLAsyncNotificationCallback 只能由驱动程序调用 -- 应用程序无法直接调用它。 每当上次返回SQL_STILL_EXECUTING后从服务器收到新数据时,驱动程序都调用 SQLAsyncNotificationCallback 。
驱动程序管理器提供回调机制,以便在相应函数返回SQL_STILL_EXECUTING后,驱动程序在异步操作取得进展时能够通知驱动程序管理器。
驱动程序管理器在驱动程序连接句柄上设置 SQL_ATTR_ASYNC_DBC_NOTIFICATION_CALLBACK 属性,并使用一个类型为 SQL_ASYNC_NOTIFICATION_CALLBACK 的非 NULL 函数指针,以便驱动程序在该句柄上以通知模式执行任何异步操作。 同样,驱动程序管理器在驱动程序语句句柄上设置SQL_ATTR_ASYNC_STMT_NOTIFICATION_CALLBACK属性,使用一个非 NULL 的函数指针(也是类型为SQL_ASYNC_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 才需要使用这类信息。