SQLFreeStmt 関数

適合 性
導入されたバージョン: ODBC 1.0 標準コンプライアンス: ISO 92

Summary
SQLFreeStmt は、特定の文に関連する処理を停止し、その文に関連付けられた開いているカーソルを閉じ、保留中の結果を破棄するか、または任意の文ハンドルに関連するすべてのリソースを解放します。

構文

  
SQLRETURN SQLFreeStmt(  
     SQLHSTMT       StatementHandle,  
     SQLUSMALLINT   Option);  

引数

StatementHandle
[入力]文ハンドル

オプション
[入力]以下のいずれかの選択肢があります:

SQL_ CLOSE: StatementHandle に関連付けられたカーソル(定義されている場合)を閉じ、保留中のすべての結果を破棄します。 アプリケーションは後で同じまたは異なるパラメータ値で SELECT 文を再度実行することで、このカーソルを再開できます。 カーソルが開かれていない場合、このオプションはアプリケーションには影響しません。 SQLCloseCursor はカーソルを閉じるために呼び出すこともできます。 詳細は 「カーソルを閉じる」をご覧ください。

SQL_DROP:このオプションは推奨されていません。 SQLFreeStmt に対して Option が SQL_DROP の呼び出しは、ドライバーマネージャーで SQLFreeHandle にマッピングされます。

SQL_UNBIND:ARDのSQL_DESC_COUNTフィールドを0に設定し、与えられたStatementHandleに対してSQLBindColでバインドされたすべてのカラムバッファを解放します。 これでブックマーク欄のバインドが解除されるわけではありません。そのために、ARDのブックマーク列のSQL_DESC_DATA_PTRフィールドをNULLに設定します。 この操作が明示的に割り当てられたディスクリプタに対して実行され、複数の文で共有されている場合、その記述子を共有するすべての文のバインディングに影響が出ることに注意してください。 詳細については、「 検索結果の概要(基本)」をご覧ください。

SQL_RESET_PARAMS:APDのSQL_DESC_COUNTフィールドを0に設定し、SQLBindParameterが設定したすべてのパラメータバッファを解放します。 この操作が複数の文で共有される明示的に割り当てられたディスクリプタに対して行われる場合、この操作はディスクリプタを共有するすべての文の結合に影響を与えます。 詳細は「 バインディングパラメータ」を参照してください。

返品

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_ERROR、またはSQL_INVALID_HANDLE。

Diagnostics

SQLFreeStmtがSQL_ERRORまたはSQL_SUCCESS_WITH_INFOを返すと、SQLGetDiagRecHandleTypeのSQL_HANDLE_STMTとStatementHandleHandleで呼び出すことで、関連するSQLSTATE値を取得できます。 以下の表は 、SQLFreeStmt が通常返すSQLSTATE値を示し、それぞれをこの関数の文脈で説明しています。「(DM)」という表記は、ドライバーマネージャーが返すSQLstateの記述の前に記載されます。 特に明記されていない限り、各 SQLSTATE 値に関連付けられている戻りコードはSQL_ERROR。

SQLSTATE エラー Description
01000 一般的な警告 ドライバー固有の情報メッセージ。 (関数はSQL_SUCCESS_WITH_INFOを返します。
HY000 一般的なエラー 特定の SQLSTATE がなく、実装固有の SQLSTATE が定義されていないエラーが発生しました。 *MessageText バッファー内の SQLGetDiagRec によって返されるエラー メッセージには、エラーとその原因が記述されています。
HY001 メモリ割り当てエラー ドライバーは、関数の実行または完了をサポートするために必要なメモリを割り当てませんでした。
HY010 関数シーケンス エラー (DM) StatementHandle に関連付けられている接続ハンドルに対して非同期実行関数が呼び出されました。 この非同期関数は SQLFreeStmt が呼び出された時点でも実行中でした。

(DM) SQLExecuteSQLExecDirect、または SQLMoreResultsStatementHandle が呼び出され、SQL_PARAM_DATA_AVAILABLEが返されました。 この関数は、すべてのストリーミングパラメータのデータを取得する前に 、Option をSQL_RESET_PARAMSに設定した状態で呼び出されました。

(DM) 非同期実行関数が StatementHandle に対して呼び出され、この関数が呼び出されたときにはまだ実行されていました。

(DM) SQLExecuteSQLExecDirectSQLBulkOperations、または SQLSetPosStatementHandle に対して呼び出され、SQL_NEED_DATAが返されました。 この関数は、すべての実行時データ パラメーターまたは列に対してデータが送信される前に呼び出されました。
HY013 メモリ管理エラー メモリが不足している可能性があるため、基になるメモリ オブジェクトにアクセスできなかったため、関数呼び出しを処理できませんでした。
HY092 オプションタイプが範囲外 (DM) Option 引数に指定された値は以下の通りではありません。

SQL_CLOSE SQL_DROP SQL_UNBIND SQL_RESET_PARAMS
HYT01 接続がタイムアウトしました データ ソースが要求に応答する前に、接続タイムアウト期間の有効期限が切れています。 接続タイムアウト期間は、SQL_ATTR_CONNECTION_TIMEOUT SQLSetConnectAttr によって設定されます。
IM001 ドライバーは、この関数をサポートしていません (DM) StatementHandle に関連付けられているドライバーは、関数をサポートしていません。

Comments

SQL_CLOSEオプションで SQLFreeStmt を呼び出すことは 、SQLCloseCursorを呼び出すのと同等ですが、SQL_CLOSEの SQLFreeStmt は文にカーソルが開いていなければアプリケーションに影響を与えません。 カーソルが開かれていない場合、 SQLCloseCursor への呼び出しでSQLSTATE 24000(無効カーソル状態)を返します。

アプリケーションは文ハンドルを解放された後に使用すべきではありません。ドライバーマネージャーは関数呼び出しでハンドルの有効性をチェックしません。

ハンドルを解放するのは良いプログラミングの実践です。 しかし、簡便化のため、以下のサンプルには割り当てられたハンドルを解放するコードは含まれていません。 ハンドルを解放する方法の例は 、SQLFreeHandle Functionを参照してください。

// SQLFreeStmt.cpp  
// compile with: user32.lib odbc32.lib  
#include <windows.h>  
#include <sqlext.h>  
  
int main() {  
   // declare and initialize the environment, connection, statement handles  
   SQLHENV henv = NULL;   // Environment     
   SQLHDBC hdbc = NULL;   // Connection handle  
   SQLHSTMT hstmt = NULL;   // Statement handle  
  
   SQLRETURN retCode;  
   HWND desktopHandle = GetDesktopWindow();   // desktop's window handle  
   SQLCHAR connStrbuffer[1024];  
   SQLSMALLINT connStrBufferLen;  
   retCode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);  
   retCode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, -1);  
   retCode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);  
   retCode = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)10, 0);  
   retCode = SQLDriverConnect(hdbc, desktopHandle, (SQLCHAR *)"Driver={SQL Server}", SQL_NTS, connStrbuffer, 1024 + 1, &connStrBufferLen, SQL_DRIVER_PROMPT);  
   retCode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);  
  
   retCode = SQLFreeStmt(hstmt, SQL_CLOSE);  
   retCode = SQLFreeStmt(hstmt, SQL_UNBIND);  
   retCode = SQLFreeStmt(hstmt, SQL_RESET_PARAMS);  
}  
~についての情報 参照先
ハンドルの割り当て SQLAllocHandle 関数
ステートメント処理の取り消し SQLCancel 関数
カーソルを閉じる SQLCloseCursor 関数
ハンドルを解放する SQLFreeHandle 関数
カーソル名の設定 SQLSetCursorName 関数