Share via


接続プロセスでのドライバー マネージャーのロール

アプリケーションはドライバー関数を直接呼び出さないことに注意してください。 代わりに、同じ名前のドライバー マネージャー関数を呼び出し、ドライバー マネージャーはドライバー関数を呼び出します。 通常、これはほぼすぐ発生します。 たとえば、アプリケーションはドライバー マネージャーで SQLExecute を呼び出し、いくつかのエラー チェックの後、ドライバー マネージャーはドライバーで SQLExecute を呼び出します。

接続プロセスが異なります。 アプリケーションが SQL_HANDLE_ENV および SQL_HANDLE_DBC オプションを指定して SQLAllocHandle を呼び出すと、関数はドライバー マネージャーでのみハンドルを割り当てます。 ドライバー マネージャーは、呼び出すドライバーがわからないため、ドライバーでこの関数を呼び出しません。 同様に、アプリケーションが未接続の接続のハンドルを SQLSetConnectAttr または SQLGetConnectAttr に渡す場合、ドライバー マネージャーのみその関数を実行します。 接続ハンドルから属性値を保存または取得し、設定されておらず、ODBC でデフォルト値が定義されていない属性の値を取得すると、SQLSTATE 08003 (接続が開いていません) を返します。

アプリケーションが SQLConnectSQLDriverConnect、または SQLBrowseConnect を呼び出すと、ドライバー マネージャーが最初に使用するドライバーを決定します。 次に、ドライバーが現在接続に読み込まれているかどうかを確認します。

  • 接続にドライバーが読み込まれていない場合、ドライバー マネージャーは、指定したドライバーが同じ環境の別の接続に読み込まれているかどうかを確認します。 そうでない場合、ドライバー マネージャーは接続にドライバーを読み込み、SQL_HANDLE_ENV オプションを使用してドライバーで SQLAllocHandle を呼び出します。

    その後、ドライバー マネージャーは、読み込まれたばかりかどうかに関係なく、SQL_HANDLE_DBC オプションを使用してドライバーの SQLAllocHandle を呼び出します。 アプリケーションが接続属性を設定した場合、ドライバー マネージャーはドライバーで SQLSetConnectAttr を呼び出します。エラーが発生した場合、ドライバー マネージャーの接続関数は SQLSTATE IM006 を返します (ドライバーの SQLSetConnectAttr が失敗しました)。 最後に、ドライバー マネージャーは、ドライバーの接続関数を呼び出します。

  • 指定したドライバーが接続に読み込まれている場合、ドライバー マネージャーはドライバーの接続関数のみを呼び出します。 この場合、ドライバーは、接続上のすべての接続属性が現在の設定を維持していることを確認する必要があります。

  • 接続に別のドライバーが読み込まれている場合、ドライバー マネージャーはドライバーで SQLFreeHandle を呼び出して接続を解放します。 ドライバーを使用する他の接続がない場合、ドライバー マネージャーは、環境を解放するドライバーで SQLFreeHandle を呼び出し、ドライバーをアンロードします。 ドライバー マネージャーは、接続にドライバーが読み込まれていない場合と同じ操作を実行します。

HandleTypeSQL_HANDLE_DBC に設定されている場合、ドライバー マネージャーはドライバーの SQLAllocHandle および SQLFreeHandle を呼び出す前に環境ハンドル (henv) をロックします。

アプリケーションが SQLDisconnect を呼び出すと、ドライバー マネージャーはドライバーで SQLDisconnect を呼び出します。 ただし、アプリケーションがドライバーに再接続した場合に備えて、ドライバーが読み込まれた状態になります。 アプリケーションが SQL_HANDLE_DBC オプションを指定して SQLFreeHandle を呼び出すと、ドライバー マネージャーはドライバーで SQLFreeHandle を呼び出します。 ドライバーが他の接続で使用されていない場合、ドライバー マネージャーは、SQL_HANDLE_ENV オプションを使用してドライバーの SQLFreeHandle を呼び出し、ドライバーをアンロードします。