共用方式為


SQLFreeHandle 函式

一致性
引進版本:ODBC 3.0 標準合規性:ISO 92

摘要
SQLFreeHandle 釋放與特定環境、連接、語句或描述元句柄相關聯的資源。

注意

此函式是釋放句柄的泛型函式。 它會取代 SQLFreeConnect SQLFreeConnect 的 ODBC 2.0 函式(用於釋放連接句柄),並 SQLFreeEnv(用於釋放環境句柄)。 SQLFreeConnectSQLFreeEnv 在 ODBC 3*.x* 中都已被取代。 SQLFreeHandle 也會取代 ODBC 2.0 函式 SQLFreeStmt(使用 SQL_DROP Option),以釋放語句句柄。 如需詳細資訊,請參閱。如需當 ODBC 3*.x* 應用程式使用 ODBC 2*.x* 驅動程式時,Driver Manager 會將此函式對應至哪些功能的詳細資訊,請參閱 對應取代函式以取得應用程式回溯相容性

語法

  
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,且至少有一個連線處於已配置或連線狀態。 SQLDisconnectSQLFreeHandleHandleType SQL_HANDLE_DBC,必須先針對每個 聯機呼叫 SQLFreeHandnnect,再呼叫具有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 線上逾時已過期 在數據源回應要求之前,連線逾時期限已過期。 連線逾時期間是透過 SQLSetConnectAttr設定,SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驅動程式不支援此函式 (DM) HandleType 自變數已SQL_HANDLE_DESC,而驅動程式是 ODBC 2*.x* 驅動程式。

(DM) HandleType 自變數已SQL_HANDLE_STMT,而且驅動程式不是有效的 ODBC 驅動程式。

評論

SQLFreeHandle 可用來釋放環境、連線、語句和描述項的句柄,如下列各節所述。 如需句柄的一般資訊,請參閱 句柄

應用程式在釋放后不應使用句柄;驅動程式管理員不會檢查函數調用中句柄的有效性。

釋放環境句柄

在呼叫具有 SQL_HANDLE_ENV HandleType 的 sqlFreeHandle SQLFreeHandle 之前,應用程式 必須針對環境中配置的所有連線呼叫 HandleType SQL_HANDLE_DBC SQLFreeHandle。 否則,SQLFreeHandle 呼叫會傳回SQL_ERROR,而且環境及任何作用中的連線都維持有效。 如需詳細資訊,請參閱 環境句柄設定環境句柄

如果環境是共用環境,則呼叫 sqlFreeHandle 的應用程式,HandleType SQL_HANDLE_ENV 在呼叫之後就不再具有環境的存取權,但環境的資源不一定可以釋放。 SQLFreeHandle 的呼叫 會遞減環境的參考計數。 驅動程式管理員會維護參考計數。 如果它未達到零,則不會釋放共用環境,因為它仍由另一個元件使用。 如果參考計數達到零,則會釋放共用環境的資源。

釋放連接句柄

在呼叫具有 SQL_HANDLE_DBC HandleTypeSQLFreeHandle 之前,如果此句柄上有連線,應用程式必須呼叫 SQLDisconnect,否則,SQLFreeHandle 傳回SQL_ERROR且連線仍然有效。

如需詳細資訊,請參閱 連接句柄與數據源或驅動程式中斷連線。

釋放語句句柄

使用 HandleType 呼叫 sqlFreeHandle,SQL_HANDLE_STMT的 HandleType,會釋放呼叫 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 會自動卸除連線上開啟的任何語句和描述項。 當應用程式釋放語句句柄時,驅動程式會釋放與該句柄相關聯的所有自動產生的描述元。

如需描述項目的詳細資訊,請參閱 描述元

程式代碼範例

如需其他程式代碼範例,請參閱 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 程式 範例