在 Windows 8 SDK 中,ODBC 新增了非同步操作完成時通知應用程式的機制,我們稱之為「完成通知」。 (更多資訊請參見 非同步執行(通知方法) 。) 本主題討論驅動程式開發者面臨的一些問題。
驅動程式管理器與驅動程式之間的介面
驅動程式管理器內部提供回調函式 SQLAsyncNotificationCallback 函式。 SQLAsyncNotificationCallback 只能由驅動程式呼叫——應用程式無法直接呼叫。 當伺服器在最後回傳SQL_STILL_EXECUTING後接收到新資料時,驅動程式會呼叫 SQLAsyncNotificationCallback 。
驅動程式管理員提供了一個回調機制,當相應函式返回 SQL_STILL_EXECUTING 並且非同步操作已經有了進展時,允許驅動程式通知驅動程式管理員。
驅動程式管理器會以非 NULL 函式指標(類型為 SQL_ASYNC_NOTIFICATION_CALLBACK)在驅動程式連接句柄上設定 SQL_ATTR_ASYNC_DBC_NOTIFICATION_CALLBACK 屬性,使驅動程式能在該句柄上進行非同步操作時以通知模式運作。 同樣地,驅動程式管理器會設定驅動程式句柄上的 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 handle屬性的當前值作為回調函式參數 pContext的值。
驅動程式不得在呼叫驅動程式函式的執行緒中回撥;在函式恢復之前,沒有必要通知進度。 驅動程式應使用其自己的執行緒來執行回調。 驅動程式管理器不會使用驅動程式的回調執行緒來執行大量處理邏輯。
驅動程式回撥後,驅動程式管理員會再次呼叫原始函式。 驅動程式管理器可以使用既非應用程式執行緒也非驅動執行緒的執行緒。 若驅動程式使用與執行緒相關的某些資訊(例如安全憑證或使用者識別碼),則應在初始非同步呼叫中儲存所需資訊,並在整個非同步操作完成前使用儲存的值。 通常只有 SQLDriverConnect、 SQLConect 或 SQLBrowseConnect 需要使用這類資訊。