Notifica del completamento di funzioni asincrone
In Windows 8 SDK, ODBC ha aggiunto un meccanismo per notificare alle applicazioni quando viene completata un'operazione asincrona, a cui si farà riferimento come "notifica al completamento". (Vedere Esecuzione asincrona (metodo di notifica) per altre informazioni). Questo argomento illustra alcuni dei problemi per gli sviluppatori di driver.
Interfaccia tra Gestione driver e driver
Gestione driver fornisce internamente una funzione di richiamata, la funzione SQLAsyncNotificationCallback. SQLAsyncNotificationCallback può essere chiamato solo dal driver. Un'applicazione non può chiamarla direttamente. Il driver chiama SQLAsyncNotificationCallback ogni volta che riceve nuovi dati dal server dopo aver restituito per l'ultima volta SQL_STILL_EXECUTING.
Gestione driver fornisce un meccanismo di richiamata in modo che un driver possa notificare a Gestione driver quando alcuni progressi sono stati eseguiti durante l'esecuzione di un'operazione asincrona dopo che la funzione corrispondente restituisce SQL_STILL_EXECUTING
Gestione driver imposta l'attributo SQL_ATTR_ASYNC_DBC_NOTIFICATION_CALLBACK su un handle di connessione driver con un puntatore a funzione non NULL, di tipo SQL_ASYNC_NOTIFICATION_CALLBACK, affinché il driver funzioni in modalità di notifica per qualsiasi operazione asincrona su tale handle. Analogamente, Gestione driver imposta l'attributo SQL_ATTR_ASYNC_STMT_NOTIFICATION_CALLBACK su un handle di istruzione driver con un puntatore a funzione non NULL, che è anche di tipo SQL_ASYNC_NOTIFICATION_CALLBACK, affinché il driver funzioni in modalità di notifica per qualsiasi operazione asincrona su tale handle.
Se un'operazione asincrona viene eseguita su un handle di driver, le funzioni del driver asincrone devono funzionare in uno stile non bloccante. Se l'operazione non può essere completata immediatamente, la funzione driver deve restituire SQL_STILL_EXECUTING. Questo requisito è vero sia per la modalità di polling che per la modalità di notifica.
Se un handle è in modalità asincrona di notifica, il driver deve chiamare la funzione di richiamata di notifica, il cui indirizzo è il valore per l'attributo SQL_ATTR_ASYNC_DBC_NOTIFICATION_CALLBACK o SQL_ATTR_ASYNC_STMT_NOTIFICATION_CALLBACK, una volta restituito SQL_STILL_EXECUTING. In altre parole, una restituzione di SQL_STILL_EXECUTING deve essere abbinata a un'invocazione della funzione di richiamata di notifica. Il driver dovrebbe usare il valore corrente dell'attributo handle SQL_ATTR_ASYNC_DBC_NOTIFICATION_CONTEXT o SQL_ATTR_ASYNC_STMT_NOTIFICATION_CONTEXT come valore per il parametro pContext della funzione di richiamo.
Il driver non deve essere richiamato nel thread che chiama la funzione del driver; non c'è motivo di comunicare l'avanzamento prima che la funzione ritorni. Il driver dovrebbe usare il proprio thread per la richiamata. Gestione driver non userà il thread di richiamata del driver per l'esecuzione di una logica di elaborazione estesa.
Gestione driver chiamerà di nuovo la funzione originale dopo il richiamo del driver. Gestione driver può usare un thread che non è né un thread dell'applicazione né un thread del driver. Se il driver usa alcune informazioni associate al thread, ad esempio token di sicurezza o ID utente, il driver deve salvare le informazioni necessarie nella chiamata asincrona iniziale e usare il valore salvato prima del completamento dell'intera operazione asincrona. In genere, solo SQLDriverConnect, SQLConnect o SQLBrowseConnect hanno bisogno di usare questo tipo di informazioni.