状態遷移
ODBC では、各環境、各接続、および各ステートメントの個別の 状態 が定義されます。 たとえば、環境には、Unallocated (環境が割り当てられていない)、Allocated (環境が割り当てられているが接続は割り当てられていない)、Connection (環境と 1 つ以上の接続が割り当てられている) の 3 つの状態が考えられます。 Connection には 7 つの状態が考えられ、ステートメントには 13 個の状態があります。
ハンドルによって識別される特定の項目は、アプリケーションが関数または特定の関数を呼び出し、その項目にハンドルを渡すと、ある状態から別の状態に移動します。 このような移動は状態遷移と呼ばれます。 たとえば、SQLAllocHandle を使用して環境ハンドルを割り当てると、環境が Unallocated から Allocated に移動し、SQLFreeHandle でそのハンドルを解放すると、Allocated から Unallocated に戻ります。 ODBC では、限られた数の有効な状態遷移が定義されています。これは、関数を特定の順序で呼び出す必要があることを別の方法で示したものです。
SQLGetConnectAttr などの 一部の関数は、状態にまったく影響しません。 その他の関数は、単一の項目の状態に影響します。 たとえば、SQLDisconnect は Connection 状態から Allocated 状態に接続を移動します。 最後に、一部の関数は複数の項目の状態に影響を与えます。 たとえば、SQLAllocHandle を使用して接続ハンドルを割り当てると、接続が Unallocated 状態から Allocated 状態に移動し、環境が Allocated 状態から Connection 状態に移動します。
アプリケーションが関数を順番に呼び出すと、状態遷移エラー が返されます。 たとえば、環境が Connection 状態にあり、アプリケーションがその環境ハンドルを使用して SQLFreeHandle を呼び出す場合、SQLFreeHandle は SQLSTATE HY010 (関数シーケンス エラー) を返します。これは、環境が Allocated 状態の場合にのみ呼び出すことができるためです。 これを無効な状態遷移として定義することで、ODBC は、アクティブな接続がある間にアプリケーションが環境を解放するのを防ぎます。
一部の状態遷移は、ODBC の設計に固有です。 たとえば、接続ハンドルを割り当てる関数には環境ハンドルが必要であるため、最初に環境ハンドルを割り当てずに接続ハンドルを割り当てることはできません。 その他の状態遷移は、ドライバー マネージャーとドライバーによって適用されます。 たとえば、 SQLExecute は準備されたステートメントを実行します。 渡されたステートメント ハンドルが Prepared 状態でない場合、SQLExecute は SQLSTATE HY010 (関数シーケンス エラー) を返します。
アプリケーションの観点から見ると、状態遷移は次のように通常簡単です。有効な状態遷移は、適切に記述されたアプリケーションのフローと連携する傾向があります。 ドライバー マネージャーとドライバーにとってはもっと複雑となります。状態遷移は、環境、各接続、および各ステートメントの状態を追跡する必要があるためです。 この作業のほとんどは、ドライバー マネージャーによって行われます。ドライバーで実行する必要がある作業のほとんどは、保留中の結果を含むステートメントで発生します。
このマニュアルのパート 1 と 2 (「ODBC の概要」および「アプリケーションとドライバーの開発」) では、状態遷移について明示的に言及しない傾向があります。 代わりに、関数を呼び出す必要がある順序を記述しています。 たとえば、「ステートメントの実行」は、SQLExecute で実行する前に、SQLPrepare でステートメントを準備する必要があることを示しています。 状態と状態遷移の完全な説明 (ドライバー マネージャーによってチェックされる遷移や、ドライバーでチェックする必要がある遷移など) については、「付録 B: ODBC 状態遷移テーブル」を参照してください。