Compartir a través de


Función SQLFreeHandle

de conformidad de
Versión introducida: Cumplimiento de estándares ODBC 3.0: ISO 92

resumen
SQLFreeHandle libera recursos asociados a un entorno específico, conexión, instrucción o identificador de descriptor.

Nota

Esta función es una función genérica para liberar identificadores. Reemplaza las funciones ODBC 2.0 sqlFreeConnect (para liberar un identificador de conexión) y sqlFreeEnv (para liberar un identificador de entorno). sqlFreeConnect y sqlFreeEnv están en desuso en ODBC 3*.x*. sqlFreeHandle reemplaza también la función ODBC 2.0 SQLFreeStmt (por la SQL_DROP Option) para liberar un identificador de instrucción. Para obtener más información, vea "Comentarios". Para obtener más información sobre lo que asigna el Administrador de controladores a esta función cuando una aplicación ODBC 3*.x* está trabajando con un controlador ODBC 2*.x*, vea Funciones de reemplazo de asignación para la compatibilidad con versiones anteriores de aplicaciones.

Sintaxis

  
SQLRETURN SQLFreeHandle(  
     SQLSMALLINT   HandleType,  
     SQLHANDLE     Handle);  

Argumentos

handleType
[Entrada] Tipo de identificador que se va a liberar SQLFreeHandle. Debe ser uno de los siguientes valores:

  • SQL_HANDLE_DBC

  • SQL_HANDLE_DBC_INFO_TOKEN

  • SQL_HANDLE_DESC

  • SQL_HANDLE_ENV

  • SQL_HANDLE_STMT

SQL_HANDLE_DBC_INFO_TOKEN controlador solo lo usa el Administrador de controladores y el controlador. Las aplicaciones no deben usar este tipo de identificador. Para obtener más información sobre SQL_HANDLE_DBC_INFO_TOKEN, vea Developing Connection-Pool Awareness in an ODBC Driver.

Si handleType no es uno de estos valores, sqlFreeHandle devuelve SQL_INVALID_HANDLE.

de identificador
[Entrada] Identificador que se va a liberar.

Devuelve

SQL_SUCCESS, SQL_ERROR o SQL_INVALID_HANDLE.

Si SQLFreeHandle devuelve SQL_ERROR, el identificador sigue siendo válido.

Diagnósticos

Cuando sqlFreeHandle devuelve SQL_ERROR, se puede obtener un valor SQLSTATE asociado de la estructura de datos de diagnóstico para el identificador que SQLFreeHandle intentó liberar pero no. En la tabla siguiente se enumeran los valores SQLSTATE devueltos normalmente por sqlFreeHandle y se explica cada uno en el contexto de esta función; la notación "(DM)" precede a las descripciones de SQLSTATEs devueltas por el Administrador de controladores. El código de retorno asociado a cada valor SQLSTATE es SQL_ERROR, a menos que se indique lo contrario.

SQLSTATE Error Descripción
HY000 Error general Se produjo un error para el que no había ningún SQLSTATE específico y para el que no se definió SQLSTATE específico de la implementación. El mensaje de error devuelto por SQLGetDiagRec en el búfer de *MessageText describe el error y su causa.
HY001 Error de asignación de memoria El controlador no pudo asignar memoria necesaria para admitir la ejecución o finalización de la función.
HY010 Error de secuencia de funciones (DM) El argumento HandleType se SQL_HANDLE_ENV y al menos una conexión estaba en un estado asignado o conectado. sqlDisconnect y sqlFreeHandle con un HandleType de SQL_HANDLE_DBC debe llamarse para cada conexión antes de llamar a SQLFreeHandle con un HandleType de SQL_HANDLE_ENV.

(DM) Se SQL_HANDLE_DBC el argumento HandleType y se llamó a la función antes de llamar a SQLDisconnect para la conexión.

(DM) El argumento HandleType se SQL_HANDLE_DBC. Se llamó a una función de ejecución asincrónica con Handle y la función todavía se estaba ejecutando cuando se llamó a esta función.

(DM) Se SQL_HANDLE_STMT SQL_HANDLE_STMT el argumento HandleType. sqlExecute, SQLExecDirect, SQLBulkOperationso sqlSetPos se llamó con el identificador de instrucción y se devolvió SQL_NEED_DATA. Se llamó a esta función antes de enviar datos para todos los parámetros o columnas de datos en ejecución.

(DM) Se SQL_HANDLE_STMT SQL_HANDLE_STMT el argumento HandleType. Se llamó a una función de ejecución asincrónica en el identificador de instrucción o en el identificador de conexión asociado y la función todavía se estaba ejecutando cuando se llamó a esta función.

(DM) El argumento HandleType se SQL_HANDLE_DESC. Se llamó a una función de ejecución asincrónica en el identificador de conexión asociado; y la función todavía se estaba ejecutando cuando se llamó a esta función.

(DM) No se publicaron todos los identificadores subsidiarias y otros recursos antes de que se llamara a sqlFreeHandle.

(DM) sqlExecute, sqlExecDirect, o sqlMoreResults se llamó a para uno de los identificadores de instrucción asociados con el handle y HandleType se estableció en SQL_HANDLE_STMT o SQL_HANDLE_DESC devolvió SQL_PARAM_DATA_AVAILABLE. Se llamó a esta función antes de recuperar los datos para todos los parámetros transmitidos.
HY013 Error de administración de memoria El argumento HandleType se SQL_HANDLE_STMT o SQL_HANDLE_DESC, y no se pudo procesar la llamada a la función porque no se pudo tener acceso a los objetos de memoria subyacentes, posiblemente debido a condiciones de memoria bajas.
HY017 Uso no válido de un identificador de descriptor asignado automáticamente. (DM) El argumento Handle se estableció en el identificador de un descriptor asignado automáticamente.
HY117 La conexión se suspende debido al estado de transacción desconocido. Solo se permiten las funciones de desconexión y solo lectura. (DM) Para obtener más información sobre el estado suspendido, vea función SQLEndTran.
HYT01 Tiempo de espera de conexión expirado El período de tiempo de espera de conexión expiró antes de que el origen de datos respondiera a la solicitud. El período de tiempo de espera de conexión se establece a través de SQLSetConnectAttr, SQL_ATTR_CONNECTION_TIMEOUT.
IM001 El controlador no admite esta función (DM) El argumento HandleType era SQL_HANDLE_DESC, y el controlador era un controlador ODBC 2*.x*.

(DM) El argumento HandleType estaba SQL_HANDLE_STMT y el controlador no era un controlador ODBC válido.

Comentarios

sqlFreeHandle se usa para liberar identificadores para entornos, conexiones, instrucciones y descriptores, como se describe en las secciones siguientes. Para obtener información general sobre los identificadores, vea Handles.

Una aplicación no debe usar un identificador una vez liberado; El Administrador de controladores no comprueba la validez de un identificador en una llamada de función.

Liberar un identificador de entorno

Antes de llamar a SQLFreeHandle con un HandleType de SQL_HANDLE_ENV, una aplicación debe llamar a SQLFreeHandle con un HandleType de SQL_HANDLE_DBC para todas las conexiones asignadas en el entorno. De lo contrario, la llamada a SQLFreeHandle devuelve SQL_ERROR y el entorno y cualquier conexión activa sigue siendo válida. Para obtener más información, vea Environment Handles and Allocating the Environment Handle.

Si el entorno es un entorno compartido, la aplicación que llama a SQLFreeHandle con un HandleType de SQL_HANDLE_ENV ya no tiene acceso al entorno después de la llamada, pero los recursos del entorno no se liberan necesariamente. La llamada a SQLFreeHandle disminuye el recuento de referencias del entorno. El Administrador de controladores mantiene el recuento de referencias. Si no alcanza cero, el entorno compartido no se libera, ya que sigue siendo utilizado por otro componente. Si el recuento de referencias alcanza cero, se liberan los recursos del entorno compartido.

Liberar un identificador de conexión

Antes de llamar a SQLFreeHandle con un HandleType de SQL_HANDLE_DBC, una aplicación debe llamar a SQLDisconnect para la conexión si hay una conexión en este identificador*.* De lo contrario, la llamada a SQLFreeHandle devuelve SQL_ERROR y la conexión sigue siendo válida.

Para obtener más información, consulte controladores de conexión y desconectar de un origen de datos o un controlador.

Liberar un identificador de instrucción

Una llamada a SQLFreeHandle con un HandleType de SQL_HANDLE_STMT libera todos los recursos asignados por una llamada a SQLAllocHandle con un HandleType de SQL_HANDLE_STMT. Cuando una aplicación llama a SQLFreeHandle para liberar una instrucción que tenga resultados pendientes, se eliminan los resultados pendientes. Cuando una aplicación libera un identificador de instrucción, el controlador libera los cuatro descriptores asignados automáticamente asociados a ese identificador. Para obtener más información, vea statement Handles and Freeing a Statement Handle.

Tenga en cuenta que sqlDisconnect quita automáticamente las instrucciones y descriptores abiertos en la conexión.

Liberar un identificador de descriptor

Una llamada a SQLFreeHandle con un HandleType de de SQL_HANDLE_DESC libera el identificador del descriptor en Handle. La llamada a SQLFreeHandle no libera ninguna memoria asignada por la aplicación a la que pueda hacer referencia un campo de puntero (incluidos SQL_DESC_DATA_PTR, SQL_DESC_INDICATOR_PTR y SQL_DESC_OCTET_LENGTH_PTR) de cualquier registro descriptor de Handle. La memoria asignada por el controlador para los campos que no son campos de puntero se libera cuando se libera el identificador. Cuando se libera un identificador de descriptor asignado por el usuario, se liberan todas las instrucciones asociadas al identificador liberado con la reversión a sus respectivos identificadores de descriptor asignados automáticamente.

Nota

Los controladores ODBC 2*.x* no admiten identificadores de descriptor de libreización, al igual que no admiten la asignación de identificadores de descriptor.

Tenga en cuenta que sqlDisconnect quita automáticamente las instrucciones y descriptores abiertos en la conexión. Cuando una aplicación libera un identificador de instrucción, el controlador libera todos los descriptores generados automáticamente asociados a ese identificador.

Para obtener más información sobre los descriptores, vea Descriptores.

Ejemplo de código

Para obtener ejemplos de código adicionales, consulte sqlBrowseConnect y SQLConnect.

Código

// SQLFreeHandle.cpp  
// compile with: user32.lib odbc32.lib  
#include <windows.h>  
#include <sqlext.h>  
#include <stdio.h>  
  
int main() {  
   SQLRETURN retCode;  
   HWND desktopHandle = GetDesktopWindow();   // desktop's window handle  
   SQLCHAR connStrbuffer[1024];  
   SQLSMALLINT connStrBufferLen;  
  
   // Initialize the environment, connection, statement handles.  
   SQLHENV henv = NULL;   // Environment     
   SQLHDBC hdbc = NULL;   // Connection handle  
   SQLHSTMT hstmt = NULL;   // Statement handle  
  
   // Allocate the environment.  
   retCode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);  
  
   // Set environment attributes.  
   retCode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, -1);  
  
   // Allocate the connection.  
   retCode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);  
  
   // Set the login timeout.  
   retCode = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)10, 0);  
  
   // Let the user select the data source and connect to the database.  
   retCode = SQLDriverConnect(hdbc, desktopHandle, (SQLCHAR *)"Driver={SQL Server}", SQL_NTS, connStrbuffer, 1025, &connStrBufferLen, SQL_DRIVER_PROMPT);  
  
   retCode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);  
  
   // Free handles, and disconnect.     
   if (hstmt) {   
      SQLFreeHandle(SQL_HANDLE_STMT, hstmt);  
      hstmt = NULL;   
   }  
   if (hdbc) {   
      SQLDisconnect(hdbc);  
      SQLFreeHandle(SQL_HANDLE_DBC, hdbc);  
      hdbc = NULL;   
   }  
   if (henv) {   
      SQLFreeHandle(SQL_HANDLE_ENV, henv);  
      henv = NULL;   
   }  
}  
Para obtener información sobre Ver
Asignación de un identificador función SQLAllocHandle
Cancelación del procesamiento de instrucciones función SQLCancel
Establecimiento de un nombre de cursor función SQLSetCursorName de

Consulte también

referencia de LA API ODBC
archivos de encabezado ODBC
de programa ODBC de ejemplo de