Partilhar via


Transições de Estado

O ODBC define estados discretos para cada ambiente, cada ligação e cada afirmação. Por exemplo, o ambiente tem três estados possíveis: Não Alocado (em que nenhum ambiente é alocado), Alocado (em que um ambiente é alocado mas não são alocadas ligações) e Ligação (em que um ambiente e uma ou mais ligações são alocados). As ligações têm sete estados possíveis; as instruções têm 13 estados possíveis.

Um determinado item, identificado pelo seu handle, move-se de um estado para outro quando a aplicação chama uma determinada função ou funções e passa o handle para esse item. Esse movimento chama-se transição de estado. Por exemplo, alocar um handle de ambiente com SQLAllocHandle move o ambiente de não alocado para alocado, e libertar esse handle com SQLFreeHandle devolve-o de alocado para não alocado. ODBC define um número limitado de transições de estado legais, ou seja, as funções do ODBC devem ser invocadas numa ordem específica.

Algumas funções, como SQLGetConnectAttr, não afetam o estado em absoluto. Outras funções afetam o estado de um único item. Por exemplo, o SQLDisconnect move uma ligação de um estado de Conexão para um estado Alocado. Finalmente, algumas funções afetam o estado de mais do que um item. Por exemplo, alocar um handle de ligação com SQLAllocHandle move uma ligação de um estado não alocado para um estado alocado e move o ambiente de um estado alocado para um estado de conexão.

Se uma aplicação chamar uma função fora de ordem, a função devolve um erro de transição de estado. Por exemplo, se um ambiente estiver num estado de Conexão e a aplicação chamar SQLFreeHandle com esse handle de ambiente, SQLFreeHandle devolve SQLSTATE HY010 (erro de sequência de funções), porque só pode ser chamado quando o ambiente está num estado Alocado. Ao definir isto como uma transição de estado inválida, o ODBC impede que a aplicação liberte o ambiente enquanto existam ligações ativas.

Algumas transições de estado são inerentes ao desenho do ODBC. Por exemplo, não é possível alocar um identificador de ligação sem primeiro alocar um identificador de ambiente, porque a função que aloca um identificador de ligação requer um identificador de ambiente. Outras transições de estado são aplicadas pelo Gestor de Condutores e pelos condutores. Por exemplo, o SQLExecute executa uma instrução preparada. Se o handle da instrução que lhe foi passado não estiver em estado Preparado, o SQLExecute devolve SQLSTATE HY010 (erro de sequência de funções).

Do ponto de vista da aplicação, as transições de estado são geralmente simples: as transições de estado jurídico tendem a andar de mãos dadas com o fluxo de uma aplicação bem escrita. As transições de estado são mais complexas para o Gestor de Controladores e para os controladores porque têm de acompanhar o estado do ambiente, cada ligação e cada instrução. A maior parte deste trabalho é feita pelo Driver Manager; a maior parte do trabalho que deve ser feito pelos drivers ocorre com instruções com resultados pendentes.

As partes 1 e 2 deste manual ("Introdução ao ODBC" e "Desenvolvimento de Aplicações e Drivers") tendem a não mencionar explicitamente as transições de estado. Em vez disso, descrevem a ordem em que as funções devem ser chamadas. Por exemplo, "Executing Statements" afirma que uma instrução deve ser preparada com SQLPrepare antes de poder ser executada com SQLExecute. Para uma descrição completa dos estados e transições de estado, incluindo quais as transições verificadas pelo Gestor de Drivers e quais devem ser verificadas pelos drivers, consulte o Apêndice B: Tabelas de Transição de Estado ODBC.