Função SQLAllocHandle

Conformidade
Versão introduzida: ODBC 3.0 Standards Compliance: ISO 92

Resumo
SQLAllocHandle aloca um ambiente, conexão, instrução ou identificador de descritor.

Observação

Essa função é uma função genérica para alocar identificadores que substitui as funções ODBC 2.0 SQLAllocConnect, SQLAllocEnv e SQLAllocStmt. Para permitir que aplicativos que chamam SQLAllocHandle funcionem com o ODBC 2. x drivers, uma chamada para SQLAllocHandle é mapeada no Gerenciador de Driver para SQLAllocConnect, SQLAllocEnv ou SQLAllocStmt, conforme apropriado. Para obter mais informações, confira "Comentários". Para obter mais informações sobre o que o Gerenciador de Driver mapeia essa função para quando um ODBC 3. o aplicativo x está trabalhando com um ODBC 2. x driver, consulte Mapeando funções de substituição para compatibilidade com versões anteriores de aplicativos.

Sintaxe

  
SQLRETURN SQLAllocHandle(  
      SQLSMALLINT   HandleType,  
      SQLHANDLE     InputHandle,  
      SQLHANDLE *   OutputHandlePtr);  

Argumentos

Handletype
[Entrada] O tipo de identificador a ser alocado por SQLAllocHandle. Deve ser um dos seguintes valores:

  • SQL_HANDLE_DBC

  • SQL_HANDLE_DBC_INFO_TOKEN

  • SQL_HANDLE_DESC

  • SQL_HANDLE_ENV

  • SQL_HANDLE_STMT

SQL_HANDLE_DBC_INFO_TOKEN identificador é usado apenas pelo Driver Manager e pelo driver. Os aplicativos não devem usar esse tipo de identificador. Para obter mais informações sobre SQL_HANDLE_DBC_INFO_TOKEN, consulte Desenvolvendo Connection-Pool reconhecimento em um driver ODBC.

InputHandle
[Entrada] O identificador de entrada em cujo contexto o novo identificador deve ser alocado. Se HandleType for SQL_HANDLE_ENV, isso será SQL_NULL_HANDLE. Se HandleType for SQL_HANDLE_DBC, esse deve ser um identificador de ambiente e, se for SQL_HANDLE_STMT ou SQL_HANDLE_DESC, ele deverá ser um identificador de conexão.

OutputHandlePtr
[Saída] Ponteiro para um buffer no qual retornar o identificador para a estrutura de dados recém-alocada.

Retornos

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_INVALID_HANDLE ou SQL_ERROR.

Ao alocar um identificador diferente de um identificador de ambiente, se SQLAllocHandle retornar SQL_ERROR, ele definirá OutputHandlePtr como SQL_NULL_HDBC, SQL_NULL_HSTMT ou SQL_NULL_HDESC, dependendo do valor de HandleType, a menos que o argumento de saída seja um ponteiro nulo. Em seguida, o aplicativo pode obter informações adicionais da estrutura de dados de diagnóstico associada ao identificador no argumento InputHandle .

Erros de alocação do identificador de ambiente

A alocação de ambiente ocorre no Gerenciador de Driver e em cada driver. O erro retornado por SQLAllocHandle com um HandleType de SQL_HANDLE_ENV depende do nível em que o erro ocorreu.

Se o Gerenciador de Driver não puder alocar memória para *OutputHandlePtr quando SQLAllocHandle com um HandleType de SQL_HANDLE_ENV for chamado ou o aplicativo fornecer um ponteiro nulo para OutputHandlePtr, SQLAllocHandle retornará SQL_ERROR. O Gerenciador de Driver define *OutputHandlePtr como SQL_NULL_HENV (a menos que o aplicativo forneceu um ponteiro nulo, que retorna SQL_ERROR). Não há nenhum identificador com o qual associar informações de diagnóstico adicionais.

O Gerenciador de Driver não chama a função de alocação do identificador de ambiente no nível do driver até que o aplicativo chame SQLConnect, SQLBrowseConnect ou SQLDriverConnect. Se ocorrer um erro na função SQLAllocHandle no nível do driver, a função SQLConnect, SQLBrowseConnect ou SQLDriverConnect no nível do Driver retornará SQL_ERROR. A estrutura de dados de diagnóstico contém SQLSTATE IM004 (falha no SQLAllocHandle do Driver). O erro é retornado em um identificador de conexão.

Para obter mais informações sobre o fluxo de chamadas de função entre o Gerenciador de Driver e um driver, consulte Função SQLConnect.

Diagnósticos

Quando SQLAllocHandle retorna SQL_ERROR ou SQL_SUCCESS_WITH_INFO, um valor SQLSTATE associado pode ser obtido chamando SQLGetDiagRec com o HandleType e Handle apropriados definidos para o valor de InputHandle. SQL_SUCCESS_WITH_INFO (mas não SQL_ERROR) pode ser retornado para o argumento OutputHandle . A tabela a seguir lista os valores SQLSTATE normalmente retornados por SQLAllocHandle e explica cada um deles no contexto dessa função; a notação "(DM)" precede as descrições de SQLSTATEs retornadas pelo Gerenciador de Driver. O código de retorno associado a cada valor SQLSTATE é SQL_ERROR, a menos que indicado de outra forma.

SQLSTATE Erro Descrição
01000 Aviso geral Mensagem informativa específica do driver. (A função retorna SQL_SUCCESS_WITH_INFO.)
08003 Conexão não aberta (DM) O argumento HandleType foi SQL_HANDLE_STMT ou SQL_HANDLE_DESC, mas a conexão especificada pelo argumento InputHandle não estava aberta. O processo de conexão deve ser concluído com êxito (e a conexão deve estar aberta) para que o driver aloque uma instrução ou identificador de descritor.
HY000 Erro geral Ocorreu um erro para o qual não havia nenhum SQLSTATE específico e para o qual nenhum SQLSTATE específico da implementação foi definido. A mensagem de erro retornada por SQLGetDiagRec no buffer *MessageText descreve o erro e sua causa.
HY001 Erro de alocação de memória (DM) O Gerenciador de Driver não pôde alocar memória para o identificador especificado.

O driver não pôde alocar memória para o identificador especificado.
HY009 Uso inválido de ponteiro nulo (DM) O argumento OutputHandlePtr era um ponteiro nulo.
HY010 Erro de sequência de funções (DM) O argumento HandleType foi SQL_HANDLE_DBC e SQLSetEnvAttr não foi chamado para definir o atributo de ambiente SQL_ODBC_VERSION.

(DM) Uma função de execução assíncrona foi chamada para o InputHandle e ainda estava em execução quando a função SQLAllocHandle foi chamada com HandleType definido como SQL_HANDLE_STMT ou SQL_HANDLE_DESC.
HY013 Erro de gerenciamento de memória O argumento HandleType foi SQL_HANDLE_DBC, SQL_HANDLE_STMT ou SQL_HANDLE_DESC; e a chamada de função não pôde ser processada porque os objetos de memória subjacentes não puderam ser acessados, possivelmente devido a condições de memória baixa.
HY014 Limite no número de identificadores excedido O limite definido pelo driver para o número de identificadores que podem ser alocados para o tipo de identificador indicado pelo argumento HandleType foi atingido.
HY092 Identificador de atributo/opção inválido (DM) O argumento HandleType não era: SQL_HANDLE_ENV, SQL_HANDLE_DBC, SQL_HANDLE_STMT ou SQL_HANDLE_DESC.
HY117 A conexão é suspensa devido ao estado de transação desconhecido. Somente funções de desconexão e somente leitura são permitidas. (DM) Para obter mais informações sobre o estado suspenso, consulte Função SQLEndTran.
HYC00 Recurso opcional não implementado O argumento HandleType foi SQL_HANDLE_DESC e o driver era um ODBC 2. x driver.
HYT01 O tempo limite da conexão expirou O período de tempo limite da conexão expirou antes da fonte de dados responder à solicitação. O período de tempo limite da conexão é definido por meio de SQLSetConnectAttr, SQL_ATTR_CONNECTION_TIMEOUT.
IM001 O driver não dá suporte a essa função (DM) O argumento HandleType foi SQL_HANDLE_STMT e o driver não era um driver ODBC válido.

(DM) O argumento HandleType foi SQL_HANDLE_DESC e o driver não dá suporte à alocação de um identificador de descritor.

Comentários

SQLAllocHandle é usado para alocar identificadores para ambientes, conexões, instruções e descritores, conforme descrito nas seções a seguir. Para obter informações gerais sobre identificadores, consulte Identificadores.

Mais de um identificador de ambiente, conexão ou instrução poderá ser alocado por um aplicativo por vez se várias alocações tiverem suporte do driver. No ODBC, nenhum limite é definido no número de identificadores de ambiente, conexão, instrução ou descritor que podem ser alocados a qualquer momento. Os drivers podem impor um limite ao número de determinado tipo de identificador que pode ser alocado por vez; para obter mais informações, consulte a documentação do driver.

Se o aplicativo chamar SQLAllocHandle com *OutputHandlePtr definido como um identificador de ambiente, conexão, instrução ou descritor que já existe, o driver substituirá as informações associadas ao identificador, a menos que o aplicativo esteja usando o pool de conexões (confira "Alocando um atributo de ambiente para pooling de conexões" mais adiante nesta seção). O Gerenciador de Driver não verifica se o identificador inserido em *OutputHandlePtr já está sendo usado, nem verifica o conteúdo anterior de um identificador antes de substituí-lo.

Observação

É uma programação de aplicativo ODBC incorreta para chamar SQLAllocHandle duas vezes com a mesma variável de aplicativo definida para *OutputHandlePtr sem chamar SQLFreeHandle para liberar o identificador antes de realocar. Substituir identificadores ODBC dessa maneira pode levar a comportamentos inconsistentes ou erros por parte dos drivers ODBC.

Em sistemas operacionais que dão suporte a vários threads, os aplicativos podem usar o mesmo identificador de ambiente, conexão, instrução ou descritor em threads diferentes. Os drivers devem, portanto, dar suporte a acesso multithread seguro a essas informações; uma maneira de conseguir isso, por exemplo, é usando uma seção crítica ou um semáforo. Para obter mais informações sobre threading, consulte Multithreading.

SQLAllocHandle não define o atributo de ambiente SQL_ATTR_ODBC_VERSION quando é chamado para alocar um identificador de ambiente; o atributo de ambiente deve ser definido pelo aplicativo ou SQLSTATE HY010 (erro de sequência de funções) será retornado quando SQLAllocHandle for chamado para alocar um identificador de conexão.

Para aplicativos compatíveis com padrões, SQLAllocHandle é mapeado para SQLAllocHandleStd em tempo de compilação. A diferença entre essas duas funções é que SQLAllocHandleStd define o atributo de ambiente SQL_ATTR_ODBC_VERSION como SQL_OV_ODBC3 quando é chamado com o argumento HandleType definido como SQL_HANDLE_ENV. Isso é feito porque os aplicativos compatíveis com padrões são sempre ODBC 3. x aplicativos. Além disso, os padrões não exigem que a versão do aplicativo seja registrada. Essa é a única diferença entre essas duas funções; caso contrário, eles são idênticos. SQLAllocHandleStd é mapeado para SQLAllocHandle dentro do gerenciador de driver. Portanto, os drivers de terceiros não precisam implementar SQLAllocHandleStd.

Os aplicativos ODBC 3.8 devem usar:

  • SQLAllocHandle e não SQLAllocHandleStd para alocar um identificador de ambiente.

  • SQLSetEnvAttr para definir o atributo de ambiente SQL_ATTR_ODBC_VERSION como SQL_OV_ODBC3_80.

Alocando um identificador de ambiente

Um identificador de ambiente fornece acesso a informações globais, como identificadores de conexão válidos e identificadores de conexão ativos. Para obter informações gerais sobre identificadores de ambiente, consulte Identificadores de ambiente.

Para solicitar um identificador de ambiente, um aplicativo chama SQLAllocHandle com um HandleType de SQL_HANDLE_ENV e um InputHandle de SQL_NULL_HANDLE. O driver aloca memória para as informações de ambiente e passa o valor do identificador associado de volta no argumento *OutputHandlePtr . O aplicativo passa o valor *OutputHandle em todas as chamadas subsequentes que exigem um argumento de identificador de ambiente. Para obter mais informações, consulte Alocando o identificador de ambiente.

No identificador de ambiente de um Gerenciador de Driver, se já existir um identificador de ambiente de driver, SQLAllocHandle com um HandleType de SQL_HANDLE_ENV não será chamado nesse driver quando uma conexão for feita, somente SQLAllocHandle com um HandleType de SQL_HANDLE_DBC. Se o identificador de ambiente de um driver não existir no identificador de ambiente do Gerenciador de Driver, SQLAllocHandle com um HandleType de SQL_HANDLE_ENV e SQLAllocHandle com um HandleType de SQL_HANDLE_DBC serão chamados no driver quando o primeiro identificador de conexão do ambiente estiver conectado ao driver.

Quando o Gerenciador de Driver processa a função SQLAllocHandle com um HandleType de SQL_HANDLE_ENV, ele verifica a palavra-chave Trace na seção [ODBC] das informações do sistema. Se estiver definido como 1, o Gerenciador de Driver habilitará o rastreamento para o aplicativo atual. Se o sinalizador de rastreamento estiver definido, o rastreamento será iniciado quando o primeiro identificador de ambiente for alocado e terminará quando o último identificador de ambiente for liberado. Para obter mais informações, consulte Configurando fontes de dados.

Depois de alocar um identificador de ambiente, um aplicativo deve chamar SQLSetEnvAttr no identificador de ambiente para definir o atributo de ambiente SQL_ATTR_ODBC_VERSION. Se esse atributo não for definido antes de SQLAllocHandle ser chamado para alocar um identificador de conexão no ambiente, a chamada para alocar a conexão retornará SQLSTATE HY010 (erro de sequência de funções). Para obter mais informações, consulte Declarando a versão ODBC do aplicativo.

Alocando ambientes compartilhados para pooling de conexões

Os ambientes podem ser compartilhados entre vários componentes em um único processo. Um ambiente compartilhado pode ser usado por mais de um componente ao mesmo tempo. Quando um componente usa um ambiente compartilhado, ele pode usar conexões em pool, que permitem alocar e usar uma conexão existente sem recriar essa conexão.

Antes de alocar um ambiente compartilhado que pode ser usado para pooling de conexões, um aplicativo deve chamar SQLSetEnvAttr para definir o atributo de ambiente SQL_ATTR_CONNECTION_POOLING como SQL_CP_ONE_PER_DRIVER ou SQL_CP_ONE_PER_HENV. SQLSetEnvAttr nesse caso é chamado com EnvironmentHandle definido como nulo, o que torna o atributo um atributo no nível do processo.

Depois que o pool de conexões tiver sido habilitado, um aplicativo chamará SQLAllocHandle com o argumento HandleType definido como SQL_HANDLE_ENV. O ambiente alocado por essa chamada será um ambiente compartilhado implícito porque o pool de conexões foi habilitado.

Quando um ambiente compartilhado é alocado, o ambiente que será usado não é determinado até que SQLAllocHandle com um HandleType de SQL_HANDLE_DBC seja chamado. Nesse ponto, o Gerenciador de Driver tenta encontrar um ambiente existente que corresponda aos atributos de ambiente solicitados pelo aplicativo. Se esse ambiente não existir, um será criado como um ambiente compartilhado. O Gerenciador de Driver mantém uma contagem de referência para cada ambiente compartilhado; a contagem é definida como 1 quando o ambiente é criado pela primeira vez. Se um ambiente correspondente for encontrado, o identificador desse ambiente será retornado ao aplicativo e a contagem de referência será incrementada. Um identificador de ambiente alocado dessa maneira pode ser usado em qualquer função ODBC que aceite um identificador de ambiente como um argumento de entrada.

Alocando um identificador de conexão

Um identificador de conexão fornece acesso a informações como a instrução válida e identificadores de descritor na conexão e se uma transação está aberta no momento. Para obter informações gerais sobre identificadores de conexão, consulte Identificadores de conexão.

Para solicitar um identificador de conexão, um aplicativo chama SQLAllocHandle com um HandleType de SQL_HANDLE_DBC. O argumento InputHandle é definido como o identificador de ambiente que foi retornado pela chamada para SQLAllocHandle que alocou esse identificador. O driver aloca memória para as informações de conexão e passa o valor do identificador associado de volta em *OutputHandlePtr. O aplicativo passa o valor *OutputHandlePtr em todas as chamadas subsequentes que exigem um identificador de conexão. Para obter mais informações, consulte Alocando um identificador de conexão.

O Gerenciador de Driver processa a função SQLAllocHandle e chama a função SQLAllocHandle do driver quando o aplicativo chama SQLConnect, SQLBrowseConnect ou SQLDriverConnect. (Para obter mais informações, consulte Função SQLConnect.)

Se o atributo de ambiente SQL_ATTR_ODBC_VERSION não estiver definido antes de SQLAllocHandle ser chamado para alocar um identificador de conexão no ambiente, a chamada para alocar a conexão retornará SQLSTATE HY010 (erro de sequência de funções).

Quando um aplicativo chama SQLAllocHandle com o argumento InputHandle definido como SQL_HANDLE_DBC e também definido como um identificador de ambiente compartilhado, o Gerenciador de Driver tenta encontrar um ambiente compartilhado existente que corresponda aos atributos de ambiente definidos pelo aplicativo. Se esse ambiente não existir, será criado um, com uma contagem de referência (mantida pelo Gerenciador de Driver) de 1. Se um ambiente compartilhado correspondente for encontrado, esse identificador será retornado ao aplicativo e sua contagem de referência será incrementada.

A conexão real que será usada não é determinada pelo Gerenciador de Driver até que SQLConnect ou SQLDriverConnect seja chamado. O Gerenciador de Driver usa as opções de conexão na chamada para SQLConnect (ou as palavras-chave de conexão na chamada para SQLDriverConnect) e os atributos de conexão definidos após a alocação de conexão para determinar qual conexão no pool deve ser usada. Para obter mais informações, consulte Função SQLConnect.

Alocando um identificador de instrução

Um identificador de instrução fornece acesso a informações de instrução, como mensagens de erro, o nome do cursor e informações de status para processamento de instrução SQL. Para obter informações gerais sobre identificadores de instrução, consulte Identificadores de instrução.

Para solicitar um identificador de instrução, um aplicativo se conecta a uma fonte de dados e, em seguida, chama SQLAllocHandle antes de enviar instruções SQL. Nessa chamada, HandleType deve ser definido como SQL_HANDLE_STMT e InputHandle deve ser definido como o identificador de conexão retornado pela chamada para SQLAllocHandle que alocou esse identificador. O driver aloca memória para as informações da instrução, associa o identificador de instrução à conexão especificada e passa o valor do identificador associado de volta em *OutputHandlePtr. O aplicativo passa o valor *OutputHandlePtr em todas as chamadas subsequentes que exigem um identificador de instrução. Para obter mais informações, consulte Alocando um identificador de instrução.

Quando o identificador de instrução é alocado, o driver aloca automaticamente um conjunto de quatro descritores e atribui os identificadores desses descritores aos atributos de instrução SQL_ATTR_APP_ROW_DESC, SQL_ATTR_APP_PARAM_DESC, SQL_ATTR_IMP_ROW_DESC e SQL_ATTR_IMP_PARAM_DESC. Eles são chamados de descritores implicitamente alocados. Para alocar um descritor de aplicativo explicitamente, confira a seção a seguir, "Alocando um identificador de descritor".

Alocando um identificador de descritor

Quando um aplicativo chama SQLAllocHandle com um HandleType de SQL_HANDLE_DESC, o driver aloca um descritor de aplicativo. Eles são chamados de descritores alocados explicitamente . O aplicativo direciona um driver para usar um descritor de aplicativo explicitamente alocado em vez de um alocado automaticamente para um determinado identificador de instrução chamando a função SQLSetStmtAttr com o atributo SQL_ATTR_APP_ROW_DESC ou SQL_ATTR_APP_PARAM_DESC. Um descritor de implementação não pode ser alocado explicitamente, nem um descritor de implementação pode ser especificado em uma chamada de função SQLSetStmtAttr .

Os descritores alocados explicitamente são associados a um identificador de conexão em vez de um identificador de instrução (como os descritores alocados automaticamente são). Os descritores permanecem alocados somente quando um aplicativo está realmente conectado ao banco de dados. Como os descritores alocados explicitamente estão associados a um identificador de conexão, um aplicativo pode associar um descritor explicitamente alocado a mais de uma instrução dentro de uma conexão. Um descritor de aplicativo alocado implicitamente, por outro lado, não pode ser associado a mais de um identificador de instrução. (Ele não pode ser associado a nenhum identificador de instrução diferente daquele para o qual foi alocado.) Identificadores de descritor explicitamente alocados podem ser liberados explicitamente pelo aplicativo ou chamando SQLFreeHandle com um HandleType de SQL_HANDLE_DESC ou implicitamente quando a conexão é fechada.

Quando o descritor explicitamente alocado é liberado, o descritor implicitamente alocado é novamente associado à instrução . (O atributo SQL_ATTR_APP_ROW_DESC ou SQL_ATTR_APP_PARAM_DESC para essa instrução é novamente definido como o identificador de descritor alocado implicitamente.) Isso é verdadeiro para todas as instruções que foram associadas ao descritor explicitamente alocado na conexão.

Para obter mais informações sobre descritores, consulte Descritores.

Exemplo de código

Consulte Programa ODBC de exemplo, Função SQLBrowseConnect, Função SQLConnect e Função SQLSetCursorName.

Para obter informações sobre Consulte
Executando uma instrução SQL Função SQLExecDirect
Executando uma instrução SQL preparada Função SQLExecute
Liberando um identificador de ambiente, conexão, instrução ou descritor Função SQLFreeHandle
Preparando uma instrução para execução Função SQLPrepare
Configurando um atributo de conexão Função SQLSetConnectAttr
Configurando um campo de descritor Função SQLSetDescField
Configurando um atributo de ambiente Função SQLSetEnvAttr
Configurando um atributo de instrução Função SQLSetStmtAttr

Consulte Também

Referência de API do ODBC
Arquivos de cabeçalho ODBC