Решение ODBC
Тогда вопрос заключается в том, как ODBC стандартизирует доступ к базе данных? Существует два архитектурных требования:
Приложения должны иметь доступ к нескольким СУБД с помощью одного исходного кода без повторной компиляции или повторного связывания.
Приложения должны одновременно получать доступ к нескольким СУБД.
И есть еще один вопрос, из-за реальности Marketplace:
- Какие функции СУБД должны предоставлять ODBC? Только функции, которые являются общими для всех СУБД или любой функции, доступной в любой СУБД?
ODBC решает эти проблемы следующим образом:
ODBC — это интерфейс уровня вызова. Чтобы решить проблему доступа приложений к нескольким СУБД с помощью одного исходного кода, ODBC определяет стандартный интерфейс командной строки. Это содержит все функции в спецификациях CLI из Open Group и ISO/IEC и предоставляет дополнительные функции, часто необходимые для приложений.
Для каждой СУБД, поддерживающей ODBC, требуется другая библиотека или драйвер. Драйвер реализует функции в API ODBC. Чтобы использовать другой драйвер, приложению не нужно перекомпилировать или повторно связать. Вместо этого приложение просто загружает новый драйвер и вызывает функции в нем. Чтобы получить доступ к нескольким СУБД одновременно, приложение загружает несколько драйверов. Поддерживаемые драйверы зависят от операционной системы. Например, в операционной системе Microsoft Windows драйверы являются библиотеками динамических ссылок (DLL).
ODBC определяет стандартную грамматику SQL. Помимо стандартного интерфейса уровня вызова ODBC определяет стандартную грамматику SQL. Эта грамматика основана на спецификации CAE Open Group SQL. Различия между двумя грамматиками являются незначительными и в первую очередь из-за различий между грамматикой SQL, необходимой внедренным SQL (Open Group) и CLI (ODBC). Существуют также некоторые расширения грамматики для предоставления общих доступных языковых функций, не охватываемых грамматикой Open Group.
Приложения могут отправлять инструкции с помощью грамматики ODBC или СУБД. Если инструкция использует грамматику ODBC, отличную от грамматики субД, драйвер преобразует его перед отправкой в источник данных. Однако такие преобразования редки, так как большинство СУБД уже используют стандартную грамматику SQL.
ODBC предоставляет диспетчер драйверов для управления одновременным доступом к нескольким СУБД. Хотя использование драйверов решает проблему одновременного доступа к нескольким СУБД, код для этого может быть сложным. Приложения, предназначенные для работы со всеми драйверами, не могут быть статически связаны с любыми драйверами. Вместо этого они должны загружать драйверы во время выполнения и вызывать функции через таблицу указателей функций. Ситуация становится более сложной, если приложение одновременно использует несколько драйверов.
Вместо того чтобы заставлять каждое приложение делать это, ODBC предоставляет диспетчер драйверов. Диспетчер драйверов реализует все функции ODBC , в основном как сквозные вызовы функций ODBC в драйверах, и статически связан с приложением или загружается приложением во время выполнения. Таким образом, приложение вызывает функции ODBC по имени в диспетчере драйверов, а не по указателю в каждом драйвере.
Если приложению нужен конкретный драйвер, сначала он запрашивает дескриптор подключения, с которым необходимо определить драйвер, а затем запрашивает, чтобы диспетчер драйверов загружал драйвер. Диспетчер драйверов загружает драйвер и сохраняет адрес каждой функции в драйвере. Чтобы вызвать функцию ODBC в драйвере, приложение вызывает ее в диспетчере драйверов и передает дескриптор подключения для драйвера. Затем диспетчер драйверов вызывает функцию с помощью адреса, хранящегося ранее.
ODBC предоставляет значительное количество функций СУБД, но не требует поддержки всех драйверов. Если ODBC предоставляет только функции, которые являются общими для всех СУБД, это будет мало пользоваться; В конце концов, причина, по которой существует много различных СУБД сегодня, заключается в том, что они имеют разные функции. Если ODBC предоставляет все функции, доступные в любой СУБД, то реализовать драйверы будет невозможно.
Вместо этого ODBC предоставляет значительное количество функций , чем поддерживается большинством СУБД, но требует от драйверов реализовать только подмножество этих функций. Драйверы реализуют оставшиеся функции только в том случае, если они поддерживаются базовыми СУБД или если они решили эмулировать их. Таким образом, приложения могут быть записаны для использования функций одной СУБД, предоставляемых драйвером для этой СУБД, использовать только те функции, которые используются всеми СУБД, или проверка для поддержки определенной функции и соответствующим образом реагировать.
Таким образом, приложение может определить, какие функции поддерживает драйвер и СУБД, ODBC предоставляет две функции (SQLGetInfo и SQLGetFunctions), которые возвращают общие сведения о возможностях драйвера и СУБД и списке функций, поддерживаемых драйвером. ODBC также определяет уровни соответствия API и грамматики SQL, определяющие широкий спектр функций, поддерживаемых драйвером. Дополнительные сведения см. в разделе "Уровни соответствия".
Важно помнить, что ODBC определяет общий интерфейс для всех предоставляемых функций. Из-за этого приложения содержат код, не зависящий от субД, и могут использовать любые драйверы, предоставляющие эти функции. Одним из преимуществ этого является то, что приложениям не нужно обновляться, если функции, поддерживаемые СУБД, улучшены; Вместо этого при установке обновленного драйвера приложение автоматически использует компоненты, так как его код предназначен для конкретного компонента, а не для конкретного драйвера или СУБД.