非同步函式完成的通知

在 Windows 8 SDK 中,ODBC 新增了在非同步作業完成時通知應用程式的機制,我們稱之為「完成時的通知」。 (如需詳細資訊,請參閱非同步執行 (通知方法)。) 本主題探討驅動程式開發人員的部分問題。

驅動程式管理員和驅動程式之間的介面

驅動程式管理員於內部提供回撥函式 SQLAsyncNotificationCallback FunctionSQLAsyncNotificationCallback 只能由驅動程式呼叫,應用程式無法直接呼叫之。 上次傳回 SQL_STILL_EXECUTING 之後,只要伺服器接收新的資料,驅動程式就會呼叫 SQLAsyncNotificationCallback

驅動程式管理員會提供回撥機制,供對應函式傳回 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_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 的值。

驅動程式不可在呼叫驅動程式函式的執行緒內回撥,因為在傳回函式前通知進度毫無意義。 驅動程式應使用自己的執行緒來回撥。 驅動程式管理員不會用驅動程式的回撥執行緒來執行大規模處理邏輯。

驅動程式管理員會在驅動程式回撥後再次呼叫始函式。 驅動程式管理員可能會用應用程式執行緒或驅動程式執行緒以外的執行緒。 如果驅動程式使用與執行緒相關聯的部分資訊 (例如安全性權杖或使用者識別碼),則驅動程式應在初始非同步呼叫中儲存必要資訊,並在整個非同步作業完成前使用已儲存的值。 一般來說,只有 SQLDriverConnectSQLConnectSQLBrowseConnect 會用到這類資訊。

另請參閱

開發 ODBC 驅動程式