Função do Gerenciador de Driver no processo de conexão
Lembre-se de que os aplicativos não chamam diretamente as funções de driver. Em vez disso, eles chamam as funções do Gerenciador de Driver com o mesmo nome e o Gerenciador de Driver chama as funções do driver. Em geral, isso acontece quase imediatamente. Por exemplo, o aplicativo chama SQLExecute no Gerenciador de Driver e, após algumas verificações de erro, o Gerenciador de Driver chama SQLExecute no driver.
O processo de conexão é diferente. Quando o aplicativo chama SQLAllocHandle com as opções SQL_HANDLE_ENV e SQL_HANDLE_DBC, a função aloca identificadores apenas no Gerenciador de Driver. O Gerenciador de Driver não chama essa função no driver porque não sabe qual driver chamar. Da mesma forma, se o aplicativo passar o identificador de uma conexão desconectada para SQLSetConnectAttr ou SQLGetConnectAttr, apenas o Gerenciador de Driver executará a função. Ele armazena ou obtém o valor do atributo de seu identificador de conexão e retorna SQLSTATE 08003 (Conexão não aberta) ao obter um valor para um atributo que não foi definido e para o qual o ODBC não define um valor padrão.
Quando o aplicativo chama SQLConnect, SQLDriverConnect ou SQLBrowseConnect, o Gerenciador de Driver primeiro determina qual driver usar. Em seguida, ele verifica se um driver está carregado na conexão:
Se nenhum driver estiver carregado na conexão, o Gerenciador de Driver verificará se o driver especificado está carregado em outra conexão no mesmo ambiente. Caso não esteja, o Gerenciador de Driver carregará o driver na conexão e chamará SQLAllocHandle no driver com a opção SQL_HANDLE_ENV.
O Gerenciador de Driver então chamará SQLAllocHandle no driver com a opção SQL_HANDLE_DBC, independentemente de ter sido carregado ou não. Se o aplicativo definir atributos de conexão, o Gerenciador de Driver chamará SQLSetConnectAttr no driver; se ocorrer um erro, a função de conexão do Gerenciador de Driver retornará SQLSTATE IM006 (Falha no SQLSetConnectAttr do driver). Por fim, o Gerenciador de Driver chama a função de conexão no driver.
Se o driver especificado for carregado na conexão, o Gerenciador de Driver chamará apenas a função de conexão no driver. Nesse caso, o driver deve garantir que todos os atributos de conexão na conexão mantenham as configurações atuais.
Se um driver diferente for carregado na conexão, o Gerenciador de Driver chamará SQLFreeHandle no driver para liberar a conexão. Se não houver outras conexões que usam o driver, o Gerenciador de Driver chamará SQLFreeHandle no driver para liberar o ambiente e descarregar o driver. Então o Gerenciador de Driver executa as mesmas operações que quando um driver não é carregado na conexão.
O Gerenciador de Driver bloqueará o identificador de ambiente (henv) antes de chamar SQLAllocHandle e SQLFreeHandle de um driver quando HandleType estiver definido como SQL_HANDLE_DBC.
Quando o aplicativo chama SQLDisconnect, o Gerenciador de Driver chama SQLDisconnect no driver. Porém, o Gerenciador de Driver mantém o driver na memória para o caso de o aplicativo se reconectar a ele. Quando o aplicativo chama SQLFreeHandle com a opção SQL_HANDLE_DBC, o Gerenciador de Driver chama SQLFreeHandle no driver. Se nenhuma outra conexão usar o driver, o Gerenciador de Driver chamará SQLFreeHandle no driver com a opção SQL_HANDLE_ENV e descarregará o driver.