Share via


Función SQLFreeHandle

Conformidad
Versión introducida: Cumplimiento de estándares odbc 3.0: ISO 92

Resumen
SQLFreeHandle libera los recursos asociados a un entorno, conexión, instrucción o identificador de descriptor específicos.

Nota

Esta función es una función genérica para liberar identificadores. Reemplaza las funciones DE 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 también reemplaza a la función DE ODBC 2.0 SQLFreeStmt (con la opción SQL_DROP) 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 Mapping Replacement Functions for Backward Compatibility of Applications.

Sintaxis

  
SQLRETURN SQLFreeHandle(  
     SQLSMALLINT   HandleType,  
     SQLHANDLE     Handle);  

Argumentos

HandleType
[Entrada] Tipo de identificador que SQLFreeHandle va a liberar. 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.

Handle
[Entrada] Identificador que se va a liberar.

Devoluciones

SQL_SUCCESS, SQL_ERROR o SQL_INVALID_HANDLE.

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

Diagnóstico

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 *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 función (DM) El argumento HandleType se SQL_HANDLE_ENV y al menos una conexión estaba en un estado asignado o conectado. Se debe llamar a SQLDisconnect y SQLFreeHandle con un HandleType de SQL_HANDLE_DBC para cada conexión antes de llamar a SQLFreeHandle con un HandleType de SQL_HANDLE_ENV.

(DM) El argumento HandleType se SQL_HANDLE_DBC 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) El argumento HandleType se SQL_HANDLE_STMT. Se llamó a SQLExecute, SQLExecDirect, SQLBulkOperations o SQLSetPos con el identificador de instrucción y 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) El argumento HandleType se SQL_HANDLE_STMT. 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 liberaron todos los identificadores secundarios y otros recursos antes de llamar a SQLFreeHandle .

(DM) SE llamó a SQLExecute, SQLExecDirect o SQLMoreResults para uno de los identificadores de instrucción asociados a Handle y HandleType 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 acceder a los objetos de memoria subyacentes, posiblemente debido a condiciones de memoria baja.
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 a un estado de transacción desconocido. Solo se permiten funciones de desconexión y de solo lectura. (DM) Para obtener más información sobre el estado suspendido, vea Función SQLEndTran.
HYT01 Se ha agotado el tiempo de espera de la conexión. 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 se SQL_HANDLE_DESC y el controlador era un controlador ODBC 2*.x*.

(DM) El argumento HandleType se 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 Identificadores.

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 permanece válida. Para obtener más información, vea Identificadores de entorno y Asignación del identificador de entorno.

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 permanece válida.

Para obtener más información, consulte Controladores de conexión y desconexiónde un origen de datos o 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 tiene 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 Identificadores de instrucción y Liberar un identificador de instrucción.

Observe 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 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 ningún 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 han asociado todas las instrucciones a las que se había asociado el 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 descriptores de liberador, al igual que no admiten la asignación de identificadores de descriptor.

Observe 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 información acerca de Vea
Asignación de un identificador Función SQLAllocHandle
Cancelación del procesamiento de instrucciones SQLCance (Functionl)
Establecimiento de un nombre de cursor Función SQLSetCursorName

Consulte también

Referencia de API ODBC
Archivos de encabezado de ODBC
Programa de ejemplo de ODBC