Condividi tramite


Ruolo del driver manager nel processo di connessione

Si tenga presente che le applicazioni non chiamano direttamente le funzioni driver. Invece, chiamano le funzioni del driver manager con lo stesso nome ed è il driver manager a chiamare le funzioni del driver. In genere, questo avviene quasi immediatamente. Per esempio, l'applicazione chiama SQLExecute nel driver manager e dopo alcuni controlli degli errori, il driver manager chiama SQLExecute nel driver.

Il processo di connessione è diverso. Quando l'applicazione chiama SQLAllocHandle con le opzioni SQL_HANDLE_ENV e SQL_HANDLE_DBC, la funzione alloca gli handle solo nel driver manager. Il driver manager non chiama questa funzione nel driver perché non sa che driver chiamare. Analogamente, se l'applicazione passa l'handle di una connessione non connessa a SQLSetConnectAttr o SQLGetConnectAttr, solo il driver manager esegue la funzione. Archivia o ottiene il valore dell'attributo dal relativo handle di connessione e restituisce SQLSTATE 08003 (Connessione non aperta) quando si ottiene un valore per un attributo che non è stato impostato e per il quale l’ODBC non definisce un valore predefinito.

Quando l'applicazione chiama SQLConnect, SQLDriverConnect o SQLBrowseConnect, il driver manager determina innanzitutto quale driver usare. Dopodiché, verifica se un driver è attualmente caricato nella connessione:

  • Se non vi è alcun driver caricato nella connessione, il driver manager controlla se il driver specificato è caricato in un'altra connessione nello stesso ambiente. In caso contrario, il driver manager carica il driver nella connessione e chiama SQLAllocHandle nel driver con l'opzione SQL_HANDLE_ENV.

    Il driver manager chiama quindi SQLAllocHandle nel driver con l'opzione SQL_HANDLE_DBC, che sia stato appena caricato o meno. Se l'applicazione imposta un qualsiasi attributo di connessione, il driver manager chiama SQLSetConnectAttr nel driver; se si verifica un errore, la funzione di connessione del driver manager restituisce SQLSTATE IM006 (SQLSetCottectAttr del driver non riuscito). Infine, il driver manager chiama la funzione di connessione nel driver.

  • Se il driver specificato viene caricato nella connessione, il driver manager chiama solo la funzione di connessione nel driver. In questo caso, il driver deve assicurarsi che tutti gli attributi di connessione nella connessione mantengano le impostazioni correnti.

  • Se nella connessione viene caricato un driver diverso, il driver manager chiama SQLFreeHandle nel driver per liberare la connessione. Se non sono presenti altre connessioni che usano il driver, il driver manager chiama SQLFreeHandle nel driver per liberare l'ambiente e scarica il driver. Dopodiché, il driver manager esegue le stesse operazioni di quando un driver non viene caricato nella connessione.

Il driver manager blocca l'handle dell'ambiente (henv) prima di chiamare SQLAllocHandle e SQLFreeHandle di un driver quando HandleType è impostato su SQL_HANDLE_DBC.

Quando l'applicazione chiama SQLDisconnect, il driver manager chiama SQLDisconnect nel driver. Tuttavia, lascia il driver caricato nel caso in cui l'applicazione si riconnetta al driver. Quando l'applicazione chiama SQLFreeHandle con l'opzione SQL_HANDLE_DBC, il driver manager chiama SQLFreeHandle nel driver. Se il driver non viene usato da altre connessioni, il driver maanger chiama SQLFreeHandle nel driver con l'opzione SQL_HANDLE_ENV e scarica il driver.