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) |
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
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;
}
}
Funciones relacionadas
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