Compartilhar via


Função do Gerenciador de Driver no processo de conexão

Lembre-se de que os aplicativos não chamam funções de driver diretamente. Em vez disso, eles chamam funções do Gerenciador de Driver com o mesmo nome e o Gerenciador de Driver chama as funções de driver. Normalmente, 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 somente 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 não conectada para SQLSetConnectAttr ou SQLGetConnectAttr, somente 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 determina primeiro qual driver usar. Em seguida, ele verifica se um driver está carregado na conexão no momento:

  • Se nenhum driver for carregado na conexão, o Gerenciador de Driver verificará se o driver especificado está carregado em outra conexão no mesmo ambiente. Caso contrário, o Gerenciador de Driver carregará o driver na conexão e chamará SQLAllocHandle no driver com a opção SQL_HANDLE_ENV.

    Em seguida, o Gerenciador de Driver chama SQLAllocHandle no driver com a opção SQL_HANDLE_DBC, independentemente de ter sido carregado há pouco. Se o aplicativo definir quaisquer 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 suas 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 usem o driver, o Gerenciador de Driver chamará SQLFreeHandle no driver para liberar o ambiente e descarregará o driver. Em seguida, o Gerenciador de Driver executa as mesmas operações de 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. No entanto, o driver permanece carregado caso o aplicativo se reconecte a ele. Quando o aplicativo chama SQLFreeHandle com a opção SQL_HANDLE_DBC, o Gerenciador de Driver chama SQLFreeHandle no driver. Se o driver não for usado por nenhuma outra conexão, o Gerenciador de Driver chamará SQLFreeHandle no driver com a opção SQL_HANDLE_ENV e descarregará o driver.