La solución ODBC
La pregunta, entonces, es ¿cómo normaliza ODBC el acceso a las bases de datos? Hay dos requisitos arquitectónicos:
Las aplicaciones deben poder acceder a varios DBMS con el mismo código fuente sin volver a compilar ni volver a vincular.
Las aplicaciones deben poder acceder a varios DBMS simultáneamente.
Y hay una pregunta más, debido a la situación del mercado:
- ¿Qué características de DBMS deben exponer ODBC? ¿Solo las características que son comunes a todos los DBMS o cualquier característica que esté disponible en cualquier DBMS?
ODBC resuelve estos problemas de la siguiente manera:
ODBC es una interfaz de nivel de llamada. Para solucionar el problema de cómo las aplicaciones acceden a varios DBMS mediante el mismo código fuente, ODBC define una CLI estándar. Contiene todas las funciones de las especificaciones de la CLI de Open Group e ISO/IEC y proporciona las funciones adicionales que normalmente requieren las aplicaciones.
Se requiere una biblioteca o controlador diferente para cada DBMS que admita ODBC. El controlador implementa las funciones en la API ODBC. Para usar otro controlador, no es necesario volver a compilar ni vincular la aplicación. En su lugar, la aplicación simplemente carga el nuevo controlador y llama a las funciones en ella. Para acceder a varios DBMS simultáneamente, la aplicación carga varios controladores. Cómo se admiten los controladores es específico del sistema operativo. Por ejemplo, en el sistema operativo Microsoft Windows, los controladores son bibliotecas de vínculos dinámicos (DLL).
ODBC define una gramática SQL estándar. Además de una interfaz de nivel de llamada estándar, ODBC define una gramática SQL estándar. Esta gramática se basa en la especificación CAE de Open Group de SQL. Las diferencias entre las dos gramáticas son insignificantes y, principalmente, debido a las diferencias entre la gramática SQL requerida por SQL insertado (Open Group) y una CLI (ODBC). También hay algunas extensiones de la gramática para exponer características de lenguaje disponibles con frecuencia que no cubre la gramática de Open Group.
Las aplicaciones pueden enviar instrucciones mediante la gramática específica de ODBC o DBMS. Si una instrucción usa una gramática ODBC diferente de la gramática específica de DBMS, el controlador la convierte antes de enviarla al origen de datos. Sin embargo, estas conversiones son poco frecuentes porque la mayoría de DBMS ya usan una gramática SQL estándar.
ODBC proporciona un Administrador de controladores para administrar el acceso simultáneo a varios DBMS. Aunque el uso de controladores resuelve el problema de acceder simultáneamente a varios DBMS, el código para hacerlo puede ser complejo. Las aplicaciones diseñadas para funcionar con todos los controladores no se pueden vincular estáticamente a ningún controlador. En su lugar, deben cargar controladores en tiempo de ejecución y llamar a las funciones en ellas mediante una tabla de punteros de función. La situación se vuelve más compleja si la aplicación usa varios controladores simultáneamente.
En lugar de forzar a cada aplicación a hacerlo, ODBC proporciona un Administrador de controladores. El Administrador de controladores implementa todas las funciones ODBC, principalmente como llamadas de tránsito a funciones ODBC en los controladores, y está vinculado estáticamente a la aplicación o lo carga la aplicación en tiempo de ejecución. Por lo tanto, la aplicación llama a las funciones ODBC por nombre en el Administrador de controladores, en lugar de por puntero en cada controlador.
Cuando una aplicación necesita un controlador determinado, primero solicita un identificador de conexión con el que identificar el controlador y, a continuación, solicita que el Administrador de controladores cargue el controlador. El Administrador de controladores carga el controlador y almacena la dirección de cada función del controlador. Para llamar a una función ODBC en el controlador, la aplicación llama a esa función en el Administrador de controladores y pasa el identificador de conexión para el controlador. A continuación, el Administrador de controladores llama a la función mediante la dirección que almacenó anteriormente.
ODBC expone un número significativo de características de DBMS, pero no requiere controladores para admitirlas todas. Si ODBC expone solo características que son comunes a todos los DBMS, no resultaría muy útil, la razón por la que existen tantos DBMS diferentes hoy en día es que tienen características diferentes. Si ODBC expone todas las características que están disponibles en cualquier DBMS, sería imposible que los controladores se implementen.
En su lugar, ODBC expone un número significativo de características, más de lo que son compatibles con la mayoría de DBMS, pero requiere controladores para implementar solo un subconjunto de esas características. Los controladores implementan las características restantes solo si son compatibles con el DBMS subyacente o si deciden emularlas. Por lo tanto, las aplicaciones se pueden escribir para aprovechar las características de un único DBMS tal como expone el controlador para ese DBMS, para usar solo las características usadas por todos los DBMS, o para comprobar la compatibilidad de una característica determinada y reaccionar en consecuencia.
Para que una aplicación pueda determinar qué características admite un controlador y DBMS, ODBC proporciona dos funciones (SQLGetInfo y SQLGetFunctions) que devuelven información general sobre las funcionalidades del controlador y DBMS y una lista de funciones que admite el controlador. ODBC también define los niveles de conformidad de la API y de la gramática SQL, que especifican una amplia gama de características compatibles con el controlador. Para más información, consulte Niveles de compatibilidad.
Es importante recordar que ODBC define una interfaz común para todas las características que expone. Por este motivo, las aplicaciones contienen código específico de características, no código específico de DBMS y pueden usar los controladores que expongan esas características. Una ventaja de esto es que las aplicaciones no necesitan actualizarse cuando se mejoran las características compatibles con un DBMS. En su lugar, cuando se instala un controlador actualizado, la aplicación usa automáticamente las características porque su código es específico de las características, no específico del controlador o específico de DBMS.