ステートメント ハンドル

ステートメントは、SELECT * FROM Employee などの SQL ステートメントと考えられるのが最も簡単です。 ただし、ステートメントは単なる SQL ステートメントではなく、ステートメントによって作成された結果セットやステートメントの実行で使用されるパラメーターなど、その SQL ステートメントに関連付けられているすべての情報で構成されます。 ステートメントには、アプリケーション定義の SQL ステートメントも必要ありません。 たとえば、SQLTables などのカタログ関数がステートメントで実行されると、テーブル名の一覧を返す定義済みの SQL ステートメントが実行されます。

各ステートメントは、ステートメント ハンドルによって識別されます。 ステートメントは 1 つの接続に関連付けられ、その接続には複数のステートメントを使用できます。 一部のドライバーでは、サポートされているアクティブなステートメントの数が制限されます。SQLGetInfo の SQL_MAX_CONCURRENT_ACTIVITIES オプションは、ドライバーが 1 つの接続でサポートするアクティブなステートメントの数を指定します。 ステートメントは、結果が保留中の場合、結果セットまたは INSERTUPDATE、または DELETE ステートメントの影響を受ける行の数、または SQLPutData への複数の呼び出しでデータが送信されている場合にアクティブに定義されます。

ODBC (ドライバー マネージャーまたはドライバー) を実装するコードの一部内で、ステートメント ハンドルは、次のようなステートメント情報を含む構造体を識別します。

  • ステートメントの状態

  • 現在のステートメント レベルの診断

  • ステートメントのパラメーターおよび結果セット列にバインドされているアプリケーション変数のアドレス

  • 各ステートメント属性の現在の設定

ステートメント ハンドルは、ほとんどの ODBC 関数で使用されます。 特に、パラメーターと結果セット列 (SQLBindParameterSQLBindCol)、ステートメントの準備と実行 (SQLPrepareSQLExecuteSQLExecDirect)、メタデータの取得 (SQLColAttributeSQLDescribeCol)、結果のフェッチ (SQLFetch)、診断の取得 (SQLGetDiagField および SQLGetDiagRec) を行うために関数で使用されます。 また、カタログ関数 (SQLColumnsSQLTables など) やその他の多くの関数でも使用されます。

ステートメント ハンドルは SQLAllocHandle で割り当てられ、SQLFreeHandle で解放されます。