Поделиться через


Роль диспетчера драйверов в процессе подключения

Помните, что приложения не вызывают функции драйвера напрямую. Вместо этого они вызывают функции диспетчера драйверов с тем же именем, а диспетчер драйверов вызывает функции драйвера. Как правило, это происходит почти сразу. Например, приложение вызывает SQLExecute в диспетчере драйверов и после нескольких проверок ошибок диспетчер драйверов вызывает SQLExecute в драйвере.

Процесс подключения отличается. Когда приложение вызывает SQLAllocHandle с параметрами SQL_HANDLE_ENV и SQL_HANDLE_DBC, функция выделяет дескриптор только в диспетчере драйверов. Диспетчер драйверов не вызывает эту функцию в драйвере, так как он не знает, какой драйвер следует вызывать. Аналогичным образом, если приложение передает дескриптор незавершенного подключения в SQLSetConnectAttr или SQLGetConnectAttr, только диспетчер драйверов выполняет функцию. Он сохраняет или получает значение атрибута из его дескриптора подключения и возвращает SQLSTATE 08003 (подключение не открыто) при получении значения для атрибута, который не был задан, и для которого ODBC не определяет значение по умолчанию.

Когда приложение вызывает SQLConnect, SQLDriverConnect или SQLBrowseConnect, диспетчер драйверов сначала определяет, какой драйвер следует использовать. Затем проверяется, загружен ли драйвер в настоящее время в соединение.

  • Если драйвер не загружен на подключение, диспетчер драйверов проверяет, загружается ли указанный драйвер на другое подключение в той же среде. Если нет, диспетчер драйверов загружает драйвер в соединении и вызывает SQLAllocHandle в драйвере с параметром SQL_HANDLE_ENV.

    Затем диспетчер драйверов вызывает SQLAllocHandle в драйвере с параметром SQL_HANDLE_DBC, независимо от того, был он только что загружен или нет. Если приложение устанавливает какие-либо атрибуты подключения, диспетчер драйверов вызывает SQLSetConnectAttr в драйвере; Если возникает ошибка, функция подключения диспетчера драйверов возвращает SQLSTATE IM006 (сбой драйвера SQLSetConnectAttr ). Наконец, диспетчер драйверов вызывает функцию подключения в драйвере.

  • Если указанный драйвер загружен на подключение, диспетчер драйверов вызывает только функцию подключения в драйвере. В этом случае драйвер должен убедиться, что все атрибуты подключения в соединении поддерживают текущие параметры.

  • Если другой драйвер загружается в подключение, диспетчер драйверов вызывает SQLFreeHandle в драйвере, чтобы освободить подключение. Если нет других подключений, использующих драйвер, диспетчер драйверов вызывает SQLFreeHandle в драйвере, чтобы освободить среду и выгрузить драйвер. Затем диспетчер драйверов выполняет те же операции, что и когда драйвер не загружен в подключение.

Диспетчер драйверов заблокирует дескриптор среды (henv) перед вызовом SQLAllocHandle драйвера и SQLFreeHandle, если для HandleType задано значение SQL_HANDLE_DBC.

Когда приложение вызывает SQLDisconnect, диспетчер драйверов вызывает SQLDisconnect в драйвере. Однако драйвер остается загруженным, если приложение повторно подключается к драйверу. Когда приложение вызывает SQLFreeHandle с параметром SQL_HANDLE_DBC, диспетчер драйверов вызывает SQLFreeHandle в драйвере. Если драйвер не используется другими подключениями, диспетчер драйверов вызывает SQLFreeHandle в драйвере с параметром SQL_HANDLE_ENV и выгрузит драйвер.