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


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

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

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

Когда приложение вызывает SQL Подключение, SQLDriver Подключение или SQLBrowse Подключение, диспетчер драйверов сначала определяет, какой драйвер следует использовать. Затем он проверка, чтобы определить, загружается ли драйвер в настоящее время на подключение:

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

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

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

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

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

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