SQLFreeHandle 函数
一致性
引入的版本:ODBC 3.0 标准符合性:ISO 92
摘要
SQLFreeHandle 释放与特定环境、连接、语句或描述符句柄关联的资源。
注意
此函数是用于释放句柄的泛型函数。 它替换了 SQLFreeConnect SQLFreeConnect(用于释放连接句柄)和 SQLFreeEnv(用于释放环境句柄)的 ODBC 2.0 函数。 SQLFreeConnect 和 SQLFreeEnv 在 ODBC 3*.x* 中均已弃用。 SQLFreeHandle 还替换了用于释放语句句柄的 ODBC 2.0 函数 SQLFreeStmt(SQL_DROP Option)。 有关详细信息,请参阅“注释”。有关 Driver Manager 将此函数映射到 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的详细信息,请参阅 在 ODBC 驱动程序中开发 Connection-Pool 感知。
如果 HandleType 不是这些值之一,SQLFreeHandle 将返回SQL_INVALID_HANDLE。
句柄
[输入]要释放的句柄。
返回
SQL_SUCCESS、SQL_ERROR或SQL_INVALID_HANDLE。
如果 SQLFreeHandle 返回SQL_ERROR,则句柄仍然有效。
诊断
SQLSTATE | 错误 | 描述 |
---|---|---|
HY000 | 常规错误 | 发生错误:没有特定的 SQLSTATE,也没有定义特定于实现的 SQLSTATE。 *MessageText 缓冲区中 SQLGetDiagRec 返回的错误消息描述了错误及其原因。 |
HY001 | 内存分配错误 | 驱动程序无法分配支持执行或完成函数所需的内存。 |
HY010 | 函数序列错误 | (DM) HandleType 参数SQL_HANDLE_ENV,并且至少有一个连接处于已分配或连接状态。 (DM) HandleType 参数SQL_HANDLE_DBC,在为连接调用 SQLDisconnect 之前调用函数。 (DM) HandleType 参数已SQL_HANDLE_DBC。 使用 Handle 调用异步执行函数,并在调用此函数时仍在执行该函数。 (DM) HandleType 参数已SQL_HANDLE_STMT。 SQLExecute、SQLExecDirect、SQLBulkOperations或 SQLSetPos 通过语句句柄调用并返回SQL_NEED_DATA。 在为所有数据执行参数或列发送数据之前调用此函数。 (DM) HandleType 参数已SQL_HANDLE_STMT。 对语句句柄或关联的连接句柄调用异步执行函数,并且调用此函数时该函数仍在执行。 (DM) HandleType 参数已SQL_HANDLE_DESC。 对关联的连接句柄调用异步执行函数;调用此函数时,该函数仍在执行。 (DM) 调用 SQLFreeHandle 之前,所有子公司句柄和其他资源均未发布。 (DM) SQLExecute、SQLExecDirect或 SQLMoreResults 调用了与 Handle 关联的语句句柄之一,HandleType 设置为SQL_HANDLE_STMT或返回SQL_HANDLE_DESC SQL_PARAM_DATA_AVAILABLE。 在检索所有流式处理参数的数据之前调用此函数。 |
HY013 | 内存管理错误 | HandleType 参数SQL_HANDLE_STMT或SQL_HANDLE_DESC,并且无法处理函数调用,因为基础内存对象无法访问,可能是由于内存条件低。 |
HY017 | 自动分配的描述符句柄的使用无效。 | (DM) Handle 参数设置为自动分配的描述符的句柄。 |
HY117 | 连接因未知事务状态而挂起。 仅允许断开连接和只读函数。 | (DM) 有关挂起状态的详细信息,请参阅 SQLEndTran 函数。 |
HYT01 | 连接超时已过期 | 在数据源响应请求之前,连接超时期限已过期。 连接超时期限是通过 sqlSetConnectAttr |
IM001 | 驱动程序不支持此函数 | (DM) HandleType 参数SQL_HANDLE_DESC,驱动程序是 ODBC 2*.x* 驱动程序。 (DM) HandleType 参数SQL_HANDLE_STMT,并且驱动程序不是有效的 ODBC 驱动程序。 |
评论
SQLFreeHandle 用于为环境、连接、语句和描述符释放句柄,如以下部分所述。 有关句柄的一般信息,请参阅 句柄。
应用程序在释放后不应使用句柄;驱动程序管理器不会检查函数调用中句柄的有效性。
释放环境句柄
在调用 具有 SQL_HANDLE_ENV HandleType 的 SQLFreeHandle 之前,应用程序 必须使用 HandleType 调用 sqlFreeHandle,HandleType SQL_HANDLE_DBC用于环境中分配的所有连接。 否则,SQLFreeHandle 调用将返回SQL_ERROR和环境,并且任何活动连接仍然有效。 有关详细信息,请参阅 环境句柄 和 分配环境句柄。
如果环境是共享环境,则调用 SQLFreeHandle 的应用程序在调用后 HandleType SQL_HANDLE_ENV不再有权访问环境,但环境的资源不一定释放。 调用 SQLFreeHandle 会减少环境的引用计数。 引用计数由驱动程序管理器维护。 如果未达到零,则共享环境不会释放,因为它仍在由另一个组件使用。 如果引用计数达到零,则会释放共享环境的资源。
释放连接句柄
在调用具有 SQL_HANDLE_DBC HandleTypeSQLFreeHandle 之前,如果此句柄上有连接,则应用程序必须为此句柄调用 SQLDisconnect。否则,SQLFreeHandle 返回SQL_ERROR且连接仍然有效。
有关详细信息,请参阅 连接句柄 和 从数据源或驱动程序断开连接。
释放语句句柄
调用具有
请注意,SQLDisconnect 会自动删除连接上打开的任何语句和描述符。
释放描述符句柄
使用 HandleTypeSQLFreeHandle 调用SQL_HANDLE_DESC释放 Handle中的描述符句柄。 对 SQLFreeHandle
注意
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 函数 |