Функция SQLFreeHandle
соответствие
Представлена версия: соответствие стандартам ODBC 3.0: ISO 92
Сводка
SQLFreeHandle освобождает ресурсы, связанные с определенной средой, подключением, оператором или дескриптором дескриптора.
Заметка
Эта функция является универсальной функцией для освобождения дескрипторов. Он заменяет функции ODBC 2.0 SQLFreeConnect (для освобождения дескриптора подключения) и SQLFreeEnv (для освобождения дескриптора среды). SQLFreeConnect и SQLFreeEnv устарели в ODBC 3*.x*. SQLFreeHandle также заменяет функцию ODBC 2.0 SQLFreeStmt (с параметром SQL_DROP option) для освобождения дескриптора инструкции. Дополнительные сведения см. в разделе "Комментарии". Дополнительные сведения о том, что диспетчер драйверов сопоставляет эту функцию с тем, когда приложение ODBC 3*.x* работает с драйвером ODBC 2*.x*, см. в разделе Функции замены сопоставления для обратной совместимости приложений.
Синтаксис
SQLRETURN SQLFreeHandle(
SQLSMALLINT HandleType,
SQLHANDLE Handle);
Аргументы
HandleType
[Входные данные] Тип дескриптора, освобождаемого SQLFreeHandle. Должно быть одним из следующих значений:
SQL_HANDLE_DBC
SQL_HANDLE_DBC_INFO_TOKEN
SQL_HANDLE_DESC
SQL_HANDLE_ENV
SQL_HANDLE_STMT
SQL_HANDLE_DBC_INFO_TOKEN дескриптор используется только диспетчером драйверов и драйвером. Приложения не должны использовать этот тип дескриптора. Дополнительные сведения о SQL_HANDLE_DBC_INFO_TOKEN см. в разработке Connection-Pool осведомленности вдрайвера ODBC.
Если HandleType не является одним из этих значений, SQLFreeHandle возвращает SQL_INVALID_HANDLE.
Дескриптор
[Входные данные] Дескриптор для освобождения.
Возвращает
SQL_SUCCESS, SQL_ERROR или SQL_INVALID_HANDLE.
Если SQLFreeHandle возвращает SQL_ERROR, дескриптор по-прежнему действителен.
Диагностика
Когда SQLFreeHandle возвращает SQL_ERROR, связанное значение SQLSTATE может быть получено из структуры диагностических данных для дескриптора, который SQLFreeHandle пытался освободиться, но не удалось. В следующей таблице перечислены значения SQLSTATE, которые обычно возвращаются SQLFreeHandle и объясняются в контексте этой функции; Нотация "(DM)" предшествует описаниям SQLSTATEs, возвращаемым диспетчером драйверов. Возвращаемый код, связанный с каждым значением SQLSTATE, SQL_ERROR, если не указано иное.
SQLSTATE | Ошибка | Описание |
---|---|---|
HY000 | Общая ошибка | Произошла ошибка, для которой не было определенного SQLSTATE и для которого не было определено значение SQLSTATE для конкретной реализации. Сообщение об ошибке, возвращаемое SQLGetDiagRec в буфере *MessageText описывает ошибку и ее причину. |
HY001 | Ошибка выделения памяти | Драйверу не удалось выделить память, необходимую для поддержки выполнения или завершения функции. |
HY010 | Ошибка последовательности функций | (DM) Аргумент HandleType (DM) Аргумент HandleType был SQL_HANDLE_DBC, а функция была вызвана перед вызовом SQLDisconnect для подключения. (DM) Аргумент HandleType был SQL_HANDLE_DBC. Асинхронно выполняющаяся функция была вызвана с Handle, и функция по-прежнему выполнялась при вызове этой функции. (DM) Аргумент (DM) Аргумент (DM) Аргумент HandleType был SQL_HANDLE_DESC. Асинхронно выполняющаяся функция была вызвана на связанном дескрипторе подключения; и функция по-прежнему выполняется при вызове этой функции. (DM) Все дочерние дескрипторы и другие ресурсы не были выпущены до вызова SQLFreeHandle. (DM) |
HY013 | Ошибка управления памятью | Аргумент HandleType был SQL_HANDLE_STMT или SQL_HANDLE_DESC, и вызов функции не удалось обработать, так как к базовым объектам памяти не удалось получить доступ, возможно, из-за низкой памяти. |
HY017 | Недопустимое использование дескриптора автоматического выделенного дескриптора. | (DM) Аргумент Handle был задан для дескриптора автоматического выделенного дескриптора. |
HY117 | Подключение приостановлено из-за неизвестного состояния транзакции. Разрешены только функции отключения и только для чтения. | (DM) Дополнительные сведения о приостановленном состоянии см. в функции SQLEndTran. |
HYT01 | Истек срок действия времени ожидания подключения | Срок ожидания подключения истек до того, как источник данных ответил на запрос. Период времени ожидания подключения задается через SQLSetConnectAttrSQL_ATTR_CONNECTION_TIMEOUT. |
IM001 | Драйвер не поддерживает эту функцию | (DM) Аргумент HandleType был SQL_HANDLE_DESC, и драйвером был драйвер ODBC 2*.x* . (DM) Аргумент |
Комментарии
SQLFreeHandle используется для освобождения дескрипторов для сред, подключений, инструкций и дескрипторов, как описано в следующих разделах. Общие сведения об дескрипторах см. в разделе Handles.
Приложение не должно использовать дескриптор после освобождения; Диспетчер драйверов не проверяет допустимость дескриптора в вызове функции.
Освобождение дескриптора среды
Прежде чем вызывать SQLFreeHandle с HandleType SQL_HANDLE_ENV, приложение должно вызывать SQLFreeHandle с HandleType SQL_HANDLE_DBC для всех подключений, выделенных в среде. В противном случае вызов SQLFreeHandle возвращает SQL_ERROR и среду и любое активное подключение остается допустимым. Дополнительные сведения см. в разделе "Обработка среды" и выделениедескриптора среды.
Если среда является общей средой, приложение, которое вызывает SQLFreeHandle с HandleType SQL_HANDLE_ENV больше не имеет доступа к среде после вызова, но ресурсы среды не обязательно освобождаются. Вызов SQLFreeHandle уменьшает количество ссылок среды. Счетчик ссылок поддерживается диспетчером драйверов. Если она не достигает нуля, общая среда не освобождается, так как она по-прежнему используется другим компонентом. Если число ссылок достигает нуля, ресурсы общей среды освобождаются.
Освобождение дескриптора подключения
Прежде чем вызывать SQLFreeHandle с HandleType SQL_HANDLE_DBC, приложение должно вызывать SQLDisconnect для подключения, если в этом дескрипторе есть подключение.* В противном случае вызов SQLFreeHandle возвращает SQL_ERROR и подключение остается допустимым.
Дополнительные сведения см. в разделе Дескриптора подключений и отключения от источника данных или драйвера.
Освобождение дескриптора инструкций
Вызов SQLFreeHandle с HandleType SQL_HANDLE_STMT освобождает все ресурсы, выделенные вызовом SQLAllocHandle с HandleType SQL_HANDLE_STMT. Когда приложение вызывает SQLFreeHandle для освобождения инструкции, которая имеет ожидающие результаты, удаляются ожидающие результаты. Когда приложение освобождает дескриптор инструкции, драйвер освобождает четыре автоматически выделенных дескриптора, связанных с этим дескриптором. Дополнительные сведения см. в разделе операторов и освобождение дескриптора инструкций.
Обратите внимание, что SQLDisconnect автоматически удаляет все инструкции и дескрипторы, открытые в соединении.
Освобождение дескриптора
Вызов SQLFreeHandle с HandleType SQL_HANDLE_DESC освобождает дескриптор в Handle. Вызов SQLFreeHandle не освобождает никакой памяти, выделенной приложением, на которое может ссылаться поле указателя (включая SQL_DESC_DATA_PTR, SQL_DESC_INDICATOR_PTR и SQL_DESC_OCTET_LENGTH_PTR) любой записи дескриптора Handle. Память, выделенная драйвером для полей, которые не являются полями указателя, освобождается при освобождении дескриптора. Когда дескриптор, выделенный пользователем, освобождается, все операторы, которые освобожденный дескриптор был связан с возвратом к соответствующим дескрипторам автоматически выделенных дескрипторов.
Заметка
Драйверы ODBC 2*.x* не поддерживают дескриптор освобождения дескрипторов, так же, как они не поддерживают выделение дескрипторов дескрипторов.
Обратите внимание, что SQLDisconnect автоматически удаляет все инструкции и дескрипторы, открытые в соединении. Когда приложение освобождает дескриптор инструкции, драйвер освобождает все автоматически созданные дескрипторы, связанные с этим дескриптором.
Дополнительные сведения о дескрипторах см. в дескрипторах.
Пример кода
Дополнительные примеры кода см. в SQLBrowseConnect и SQLConnect.
Код
// 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;
}
}
Связанные функции
Сведения о | Видеть |
---|---|
Выделение дескриптора | функции SQLAllocHandle |
Отмена обработки инструкций | функции SQLCancel |
Задание имени курсора | функция SQLSetCursorName |
См. также
Справочник по API ODBC
файлы заголовков ODBC
пример программы ODBC