次の方法で共有


SQLFreeHandle 関数

準拠
導入されたバージョン: ODBC 3.0 標準コンプライアンス: ISO 92

の概要
SQLFreeHandle は、特定の環境、接続、ステートメント、または記述子ハンドルに関連付けられているリソースを解放します。

手記

この関数は、ハンドルを解放するためのジェネリック関数です。 ODBC 2.0 関数 SQLFreeConnect (接続ハンドルを解放する場合) と SQLFreeEnv (環境ハンドルの解放用) 置き換えます。 SQLFreeConnect と SQLFreeEnv は、どちらも ODBC 3*.x* では非推奨です。 SQLFreeHandle では、ステートメント ハンドルを解放するために、SQLFreeStmt ODBC 2.0 関数 (SQL_DROP オプション) も置き換えられます。 詳細については、「コメント」を参照してください。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 がこれらの値の 1 つでない場合、SQLFreeHandle はSQL_INVALID_HANDLEを返します。

ハンドル
[入力]解放するハンドル。

収益

SQL_SUCCESS、SQL_ERROR、またはSQL_INVALID_HANDLE。

SQLFreeHandle SQL_ERRORが返された場合、ハンドルは引き続き有効です。

診断

SQLFreeHandle がSQL_ERRORを返す場合、SQLFreeHandle 解放しようとしたが、解放できなかったハンドルの診断データ構造から、関連付けられている SQLSTATE 値を取得できます。 次の表は、通常、SQLFreeHandle によって返される SQLSTATE 値の一覧を示し、この関数のコンテキストでそれぞれについて説明します。"(DM)" という表記は、ドライバー マネージャーによって返される SQLSTATEs の説明の前にあります。 特に明記されていない限り、各 SQLSTATE 値に関連付けられている戻りコードはSQL_ERROR。

SQLSTATE エラー 形容
HY000 一般的なエラー 特定の SQLSTATE がなく、実装固有の SQLSTATE が定義されていないエラーが発生しました。 *MessageText バッファー SQLGetDiagRec によって返されるエラー メッセージは、エラーとその原因を説明します。
HY001 メモリ割り当てエラー ドライバーは、関数の実行または完了をサポートするために必要なメモリを割り当てませんでした。
HY010 関数シーケンス エラー (DM) HandleType 引数がSQL_HANDLE_ENVされ、少なくとも 1 つの接続が割り当て済みまたは接続状態でした。 SQLDisconnect、SQL_HANDLE_DBCの HandleType を持つ SQLFreeHandle を呼び出してから、SQL_HANDLE_ENVの HandleType を使用して SQLFreeHandle 呼び出す必要があります。

(DM) HandleType 引数がSQL_HANDLE_DBCされ、接続の SQLDisconnect 呼び出す前に関数が呼び出されました。

(DM) HandleType 引数がSQL_HANDLE_DBCされました。 ハンドル を使用して非同期実行関数が呼び出され、この関数が呼び出されたときに関数がまだ実行されていました。

(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) SQLExecuteSQLExecDirect、または SQLMoreResults は、ハンドル に関連付けられたステートメント ハンドルの 1 つに対して呼び出され、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 は、次のセクションで説明するように、環境、接続、ステートメント、および記述子のハンドルを解放するために使用されます。 ハンドルに関する一般的な情報については、「ハンドルの」を参照してください。

アプリケーションは、解放された後にハンドルを使用しないでください。ドライバー マネージャーは、関数呼び出しのハンドルの有効性を確認しません。

環境ハンドルの解放

HandleType SQL_HANDLE_ENV を使用して SQLFreeHandle を呼び出す前に、アプリケーションは、環境内で割り当てられているすべての接続に対 して、HandleType のSQL_HANDLE_DBCを使用して SQLFreeHandle を呼び出す必要があります。 それ以外の場合、SQLFreeHandle の呼び出しはSQL_ERRORを返し、環境とアクティブな接続は有効なままです。 詳細については、「環境ハンドルの と環境ハンドルの割り当てを する」を参照してください。

環境が共有環境の場合、SQL_HANDLE_ENVの HandleTypeSQLFreeHandle を呼び出すアプリケーションは、呼び出し後に環境にアクセスできなくなりますが、環境のリソースは必ずしも解放されません。 SQLFreeHandle 呼び出すと、環境の参照カウントがデクリメントされます。 参照カウントは、ドライバー マネージャーによって管理されます。 ゼロに達しない場合、共有環境は別のコンポーネントによって引き続き使用されているため、解放されません。 参照カウントが 0 に達すると、共有環境のリソースが解放されます。

接続ハンドルの解放

SQL_HANDLE_DBCの HandleType を使用して SQLFreeHandle 呼び出す前に、このハンドル** に接続がある場合、アプリケーションは接続 SQLDisconnect を呼び出 す必要があります。それ以外の場合、SQLFreeHandle への呼び出しはSQL_ERRORを返し、接続は有効なままです。

詳細については、「接続ハンドルのデータ ソースまたはドライバーからの切断」を参照してください。

ステートメント ハンドルの解放

SQL_HANDLE_STMTの HandleType を使用して SQLFreeHandle を すると、HandleTypeSQL_HANDLE_STMT を持つ SQLAllocHandle の呼び出しによって割り当てられたすべてのリソースが解放されます。 アプリケーションが SQLFreeHandle 呼び出して保留中の結果を含むステートメントを解放すると、保留中の結果が削除されます。 アプリケーションがステートメント ハンドルを解放すると、ドライバーは、そのハンドルに関連付けられている 4 つの自動的に割り当てられた記述子を解放します。 詳細については、「ステートメント ハンドル およびステートメント ハンドルの解放 」を参照してください。

SQLDisconnect 接続で開いているステートメントと記述子は自動的に削除されます。

記述子ハンドルの解放

SQL_HANDLE_DESCの HandleType を使用して SQLFreeHandle を 呼び出すと、Handleの記述子ハンドルが解放されます。 SQLFreeHandle の呼び出しでは、アプリケーションによって割り当てられたメモリは解放されません。このメモリは、Handleの記述子レコードのポインター フィールド (SQL_DESC_DATA_PTR、SQL_DESC_INDICATOR_PTR、SQL_DESC_OCTET_LENGTH_PTRを含む) によって参照される可能性があります。 ポインター フィールドではないフィールドに対してドライバーによって割り当てられたメモリは、ハンドルが解放されると解放されます。 ユーザー割り当て記述子ハンドルが解放されると、解放されたハンドルが関連付けられているすべてのステートメントは、自動的に割り当てられたそれぞれの記述子ハンドルに戻ります。

手記

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 関数 の

関連項目

ODBC API リファレンス
ODBC ヘッダー ファイル の
サンプル ODBC プログラムの