Função SQLFreeStmt

Conformidade
Versão Introduzida: Normas ODBC 1.0 Conformidade: ISO 92

Summary
O SQLFreeStmt interrompe o processamento associado a uma instrução específica, fecha quaisquer cursores abertos associados à instrução, descarta resultados pendentes ou, opcionalmente, liberta todos os recursos associados ao handle da instrução.

Syntax

  
SQLRETURN SQLFreeStmt(  
     SQLHSTMT       StatementHandle,  
     SQLUSMALLINT   Option);  

Arguments

HandleStatement
[Entrada] Handler da instrução

Opção
[Entrada] Uma das seguintes opções:

SQL_ FECHAR: Fecha o cursor associado ao StatementHandle (se estiver definido) e descarta todos os resultados pendentes. A aplicação pode reabrir este cursor mais tarde, executando novamente uma instrução SELECT com os mesmos valores de parâmetro ou valores diferentes. Se nenhum cursor estiver aberto, esta opção não tem efeito para a aplicação. O SQLCloseCursor também pode ser chamado para fechar um cursor. Para mais informações, veja Fechar o Cursor.

SQL_DROP: Esta opção está obsoleta. Uma chamada ao SQLFreeStmt com uma opção de SQL_DROP é mapeada no Gestor de Drivers para SQLFreeHandle.

SQL_UNBIND: Define o campo de SQL_DESC_COUNT do ARD para 0, libertando todos os buffers de coluna vinculados por SQLBindCol para o dado StatementHandle. Isto não desvincula a coluna de marcadores; para isso, o campo SQL_DESC_DATA_PTR do ARD para a coluna de favoritos é definido como NULL. Note que, se esta operação for realizada num descritor explicitamente alocado que é partilhado por mais do que uma instrução, a operação afetará as ligações de todas as instruções que partilham o descritor. Para mais informações, consulte Visão Geral sobre Obtenção de Resultados (Básico).

SQL_RESET_PARAMS: Define o campo SQL_DESC_COUNT do APD para 0, libertando todos os buffers de parâmetros definidos pelo SQLBindParameter para o StatementHandle dado. Se esta operação for realizada num descritor explicitamente alocado que é partilhado por mais do que uma instrução, esta operação afetará as ligações de todas as instruções que partilham o descritor. Para mais informações, consulte Parâmetros de Ligação.

Devoluções

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR ou SQL_INVALID_HANDLE.

Diagnósticos

Quando SQLFreeStmt retorna SQL_ERROR ou SQL_SUCCESS_WITH_INFO, um valor SQLSTATE associado pode ser obtido chamando SQLGetDiagRec com um HandleType de SQL_HANDLE_STMT e um Handle de StatementHandle. A tabela seguinte lista os valores SQLSTATE normalmente devolvidos pelo SQLFreeStmt e explica cada um no contexto desta função; a notação "(DM)" precede as descrições dos SQLSTATEs devolvidas pelo Gestor de Drivers. O código de retorno associado a cada valor SQLSTATE é SQL_ERROR, salvo indicação em contrário.

SQLSTATE Erro Descrição
01000 Aviso geral Mensagem informativa específica para o condutor. (Função devolve SQL_SUCCESS_WITH_INFO.)
HY000 Erro geral Ocorreu um erro para o qual não existia um SQLSTATE específico e para o qual não estava definido nenhum SQLSTATE específico da implementação. A mensagem de erro devolvida pelo SQLGetDiagRec no buffer *MessageText descreve o erro e a sua causa.
HY001 Erro de alocação de memória O driver não conseguia alocar a memória necessária para suportar a execução ou conclusão da função.
HY010 Erro de sequência de funções (DM) Uma função de execução assíncrona era chamada para o handle de ligação associado ao StatementHandle. Esta função assíncrona ainda estava a ser executada quando o SQLFreeStmt foi chamado.

(DM) SQLExecute, SQLExecDirect ou SQLMoreResults era chamado para o StatementHandle e devolvido SQL_PARAM_DATA_AVAILABLE. Esta função era chamada com a opção definida para SQL_RESET_PARAMS antes de os dados serem recuperados para todos os parâmetros transmitidos.

(DM) Uma função de execução assíncrona era chamada para o StatementHandle e ainda estava a correr quando esta função foi chamada.

(DM) SQLExecute, SQLExecDirect, SQLBulkOperations ou SQLSetPos era chamado para o StatementHandle e devolvido SQL_NEED_DATA. Esta função era chamada antes de os dados serem enviados para todos os parâmetros ou colunas de dados na execução.
HY013 Erro de gestão de memória A chamada de função não podia ser processada porque os objetos de memória subjacentes não podiam ser acedidos, possivelmente devido a condições de baixa memória.
HY092 Tipo de opção fora do alcance (DM) O valor especificado para o argumento Opção não era:

SQL_CLOSE SQL_DROP SQL_UNBIND SQL_RESET_PARAMS
HYT01 Expirou o tempo limite de ligação O período de timeout da ligação expirou antes de a fonte de dados responder ao pedido. O período de tempo de expiração da ligação é definido através do SQLSetConnectAttr, SQL_ATTR_CONNECTION_TIMEOUT.
IM001 O driver não suporta esta função (DM) O driver associado ao StatementHandle não suporta a função.

Comments

Chamar SQLFreeStmt com a opção SQL_CLOSE é equivalente a chamar SQLCloseCursor, exceto que SQLFreeStmt com SQL_CLOSE não afeta a aplicação se não houver cursor aberto na instrução. Se não houver cursor aberto, uma chamada ao SQLCloseCursor devolve SQLSTATE 24000 (estado do cursor inválido).

Uma aplicação não deve usar um handle de instrução depois de ter sido libertado; o Gestor de Drivers não verifica a validade de um handle numa chamada de função.

Example

É uma boa prática de programação libertar handles. No entanto, para simplificar, o exemplo seguinte não inclui código que liberte os handles alocados. Para um exemplo de como libertar handles, veja Função SQLFreeHandle.

// SQLFreeStmt.cpp  
// compile with: user32.lib odbc32.lib  
#include <windows.h>  
#include <sqlext.h>  
  
int main() {  
   // declare and initialize the environment, connection, statement handles  
   SQLHENV henv = NULL;   // Environment     
   SQLHDBC hdbc = NULL;   // Connection handle  
   SQLHSTMT hstmt = NULL;   // Statement handle  
  
   SQLRETURN retCode;  
   HWND desktopHandle = GetDesktopWindow();   // desktop's window handle  
   SQLCHAR connStrbuffer[1024];  
   SQLSMALLINT connStrBufferLen;  
   retCode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);  
   retCode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, -1);  
   retCode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);  
   retCode = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)10, 0);  
   retCode = SQLDriverConnect(hdbc, desktopHandle, (SQLCHAR *)"Driver={SQL Server}", SQL_NTS, connStrbuffer, 1024 + 1, &connStrBufferLen, SQL_DRIVER_PROMPT);  
   retCode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);  
  
   retCode = SQLFreeStmt(hstmt, SQL_CLOSE);  
   retCode = SQLFreeStmt(hstmt, SQL_UNBIND);  
   retCode = SQLFreeStmt(hstmt, SQL_RESET_PARAMS);  
}  
Para obter informações sobre Veja
Atribuição de uma alça Função SQLAllocHandle
Cancelamento do processamento de extratos Função SQLCancel
Fechar um cursor Função Cursor SQLCloseCursor
Libertar uma pega Função SQLFreeHandle
Definir um nome de cursor Função SQLSetCursorName