SQLFreeHandle 函数

一致性
引入的版本:ODBC 3.0 标准符合性:ISO 92

摘要
SQLFreeHandle 释放与特定环境、连接、语句或描述符句柄关联的资源。

注意

此函数是用于释放句柄的泛型函数。 它替换了 SQLFreeConnect SQLFreeConnect(用于释放连接句柄)和 SQLFreeEnv(用于释放环境句柄)的 ODBC 2.0 函数。 SQLFreeConnectSQLFreeEnv 在 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,则句柄仍然有效。

诊断

SQLFreeHandle 返回SQL_ERROR时,可以从 sqlFreeHandle 尝试释放但无法释放的句 柄的诊断数据结构中获取关联的 SQLSTATE 值。 下表列出了通常由 SQLFreeHandle 返回的 SQLSTATE 值,并在此函数的上下文中解释每个值;表示法“(DM)”位于驱动程序管理器返回的 SQLSTATE 的说明之前。 除非另有说明,否则与每个 SQLSTATE 值关联的返回代码SQL_ERROR。

SQLSTATE 错误 描述
HY000 常规错误 发生错误:没有特定的 SQLSTATE,也没有定义特定于实现的 SQLSTATE。 *MessageText 缓冲区中 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成函数所需的内存。
HY010 函数序列错误 (DM) HandleType 参数SQL_HANDLE_ENV,并且至少有一个连接处于已分配或连接状态。 SQLDisconnectSQLFreeHandle,必须为每个连接调用 HandleType SQL_HANDLE_DBC,然后才能 调用具有 HandleType SQL_HANDLE_ENV HandleType 的 SQLFreeHandle。

(DM) HandleType 参数SQL_HANDLE_DBC,在为连接调用 SQLDisconnect 之前调用函数。

(DM) HandleType 参数已SQL_HANDLE_DBC。 使用 Handle 调用异步执行函数,并在调用此函数时仍在执行该函数。

(DM) HandleType 参数已SQL_HANDLE_STMT。 SQLExecuteSQLExecDirectSQLBulkOperationsSQLSetPos 通过语句句柄调用并返回SQL_NEED_DATA。 在为所有数据执行参数或列发送数据之前调用此函数。

(DM) HandleType 参数已SQL_HANDLE_STMT。 对语句句柄或关联的连接句柄调用异步执行函数,并且调用此函数时该函数仍在执行。

(DM) HandleType 参数已SQL_HANDLE_DESC。 对关联的连接句柄调用异步执行函数;调用此函数时,该函数仍在执行。

(DM) 调用 SQLFreeHandle 之前,所有子公司句柄和其他资源均未发布。

(DM) SQLExecuteSQLExecDirectSQLMoreResults 调用了与 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 连接超时已过期 在数据源响应请求之前,连接超时期限已过期。 连接超时期限是通过 sqlSetConnectAttrSQL_ATTR_CONNECTION_TIMEOUT设置的。
IM001 驱动程序不支持此函数 (DM) HandleType 参数SQL_HANDLE_DESC,驱动程序是 ODBC 2*.x* 驱动程序。

(DM) HandleType 参数SQL_HANDLE_STMT,并且驱动程序不是有效的 ODBC 驱动程序。

评论

SQLFreeHandle 用于为环境、连接、语句和描述符释放句柄,如以下部分所述。 有关句柄的一般信息,请参阅 句柄

应用程序在释放后不应使用句柄;驱动程序管理器不会检查函数调用中句柄的有效性。

释放环境句柄

在调用 具有 SQL_HANDLE_ENV HandleType 的 SQLFreeHandle 之前,应用程序 必须使用 HandleType 调用 sqlFreeHandleHandleType SQL_HANDLE_DBC用于环境中分配的所有连接。 否则,SQLFreeHandle 调用将返回SQL_ERROR和环境,并且任何活动连接仍然有效。 有关详细信息,请参阅 环境句柄分配环境句柄

如果环境是共享环境,则调用 SQLFreeHandle 的应用程序在调用后 HandleType SQL_HANDLE_ENV不再有权访问环境,但环境的资源不一定释放。 调用 SQLFreeHandle 会减少环境的引用计数。 引用计数由驱动程序管理器维护。 如果未达到零,则共享环境不会释放,因为它仍在由另一个组件使用。 如果引用计数达到零,则会释放共享环境的资源。

释放连接句柄

在调用具有 SQL_HANDLE_DBC HandleTypeSQLFreeHandle 之前,如果此句柄上有连接,则应用程序必须为此句柄调用 SQLDisconnect。否则,SQLFreeHandle 返回SQL_ERROR且连接仍然有效。

有关详细信息,请参阅 连接句柄从数据源或驱动程序断开连接。

释放语句句柄

调用具有 HandleType SQL_HANDLE_STMT的 sqlFreeHandle SQLFreeHandle 释放调用 SQLAllocHandle 分配的所有资源,HandleType 为 SQL_HANDLE_STMT。 当应用程序调用 SQLFreeHandle 释放具有挂起结果的语句时,将删除挂起的结果。 当应用程序释放语句句柄时,驱动程序释放与该句柄关联的四个自动分配的描述符。 有关详细信息,请参阅 语句句柄释放语句句柄

请注意,SQLDisconnect 会自动删除连接上打开的任何语句和描述符。

释放描述符句柄

使用 HandleTypeSQLFreeHandle 调用SQL_HANDLE_DESC释放 Handle中的描述符句柄。 对 SQLFreeHandle 调用不会释放应用程序分配的任何内存,这些内存可由指针字段(包括SQL_DESC_DATA_PTR、SQL_DESC_INDICATOR_PTR和SQL_DESC_OCTET_LENGTH_PTR)引用的任何描述符记录 Handle。 当释放句柄时,驱动程序为不是指针字段的字段分配的内存将释放。 释放用户分配的描述符句柄时,释放句柄的所有语句都与还原到各自的自动分配描述符句柄相关联。

注意

ODBC 2*.x* 驱动程序不支持释放描述符句柄,就像它们不支持分配描述符句柄一样。

请注意,SQLDisconnect 会自动删除连接上打开的任何语句和描述符。 当应用程序释放语句句柄时,驱动程序释放与该句柄关联的所有自动生成的描述符。

有关描述符的详细信息,请参阅 描述符

代码示例

有关其他代码示例,请参阅 SQLBrowseConnectSQLConnect

法典

// 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 函数

另请参阅

ODBC API 参考
ODBC 头文件
示例 ODBC 程序