Soluzione ODBC
La domanda, quindi, è in che modo ODBC standardizza l'accesso al database? Esistono due requisiti di architettura:
Le applicazioni devono essere in grado di accedere a più DBMS usando lo stesso codice sorgente senza ricompilare o ricollegare.
Le applicazioni devono essere in grado di accedere contemporaneamente a più DBMS.
E c'è un'altra domanda, dovuta alla realtà del marketplace:
- Quali funzionalità DBMS devono esporre ODBC? Solo le funzionalità comuni a tutti i DBMS o qualsiasi funzionalità disponibile su qualsiasi sistema DBMS?
ODBC risolve questi problemi nel modo seguente:
ODBC è una call-level interface. Per risolvere il problema di come le applicazioni accedono a più DBMS utilizzando lo stesso codice sorgente, ODBC definisce una CLI standard. Contiene tutte le funzioni delle specifiche CLI di Open Group e ISO/IEC e fornisce funzioni aggiuntive comunemente richieste dalle applicazioni.
Per ogni DBMS che supporta ODBC è necessaria una libreria o un driver diverso. Il driver implementa le funzioni nell'API ODBC. Per usare un driver diverso, non è necessario ricompilare o ricollegare l'applicazione. Al contrario, l'applicazione carica semplicemente il nuovo driver e chiama le funzioni in esso contenute. Per accedere contemporaneamente a più DBMS, l'applicazione carica più driver. La modalità di supporto dei driver è specifica del sistema operativo. Ad esempio, nel sistema operativo Microsoft Windows, i driver sono librerie di collegamento dinamico (DLL).
ODBC definisce una grammatica SQL standard. Oltre a una call-level interface standard, ODBC definisce anche una grammatica SQL standard. Questa grammatica si basa sulla specifica OPEN Group SQL CAE. Le differenze tra le due grammatiche sono minori e principalmente a causa delle differenze tra la grammatica SQL richiesta da SQL incorporato (Open Group) e un'interfaccia della riga di comando (ODBC). Esistono anche alcune estensioni della grammatica per esporre le caratteristiche della lingua comunemente disponibili non coperte dalla grammatica dell'Open Group.
Le applicazioni possono inviare istruzioni usando la grammatica specifica di ODBC o DBMS. Se un'istruzione usa una grammatica ODBC diversa dalla grammatica specifica di DBMS, il driver lo converte prima di inviarlo all'origine dati. Tuttavia, tali conversioni sono rare perché la maggior parte dei DBMS usa già la grammatica SQL standard.
ODBC fornisce Gestione driver per gestire l'accesso simultaneo a più DBMS. Anche se l'uso dei driver risolve il problema di accesso simultaneo a più DBMS, il codice a tale scopo può essere complesso. Le applicazioni progettate per funzionare con tutti i driver non possono essere collegate in modo statico ad alcun driver. Devono invece caricare i driver in fase di esecuzione e chiamare le funzioni in essi contenute tramite una tabella di puntatori a funzione. La situazione diventa più complessa se l'applicazione usa più driver contemporaneamente.
Invece di forzare ogni applicazione a eseguire questa operazione, ODBC fornisce Gestione driver. Gestione driver implementa tutte le funzioni ODBC, principalmente come chiamate pass-through alle funzioni ODBC nei driver, ed è collegato in modo statico all'applicazione o caricato dall'applicazione in fase di esecuzione. Pertanto, l'applicazione chiama le funzioni ODBC in base al nome in Gestione driver, anziché in base al puntatore in ogni driver.
Quando un'applicazione richiede un driver specifico, richiede innanzitutto un handle di connessione con cui identificare il driver e quindi richiede che Gestione driver carichi il driver. Gestione driver carica il driver e archivia l'indirizzo di ogni funzione nel driver. Per chiamare una funzione ODBC nel driver, l'applicazione chiama tale funzione in Gestione driver e passa l'handle di connessione per il driver. Gestione driver chiama quindi la funzione usando l'indirizzo archiviato in precedenza.
ODBC espone un numero significativo di funzioni DBMS, ma non richiede il supporto di tutti i driver. Se ODBC espone solo le funzioni comuni a tutti i DBMS, sarebbe poco utile; dopo tutto, il motivo per cui esistono tanti DBMS diversi oggi è che hanno caratteristiche diverse. Se ODBC ha esposto tutte le funzioni disponibili in qualsiasi sistema DBMS, sarebbe impossibile implementare i driver.
ODBC espone invece un numero significativo di funzioni, più di quelle supportate dalla maggior parte dei DBMS, ma richiede che i driver implementino solo un subset di tali funzioni. I driver implementano le funzioni rimanenti solo se sono supportate dal sistema DBMS sottostante o se scelgono di emularle. Pertanto, le applicazioni possono essere scritte per sfruttare le funzioni di un singolo DBMS esposto dal driver per tale DBMS, per usare solo tali funzioni usate da tutti i DBMS o per verificare il supporto di una particolare funzion e reagire di conseguenza.
In modo che un'applicazione possa determinare quali funzioni sono supportate da un driver e un supporto DBMS, ODBC fornisce due funzioni (SQLGetInfo e SQLGetFunctions) che restituiscono informazioni generali sulle funzioni del driver e del DBMS e un elenco di funzioni supportate dal driver. ODBC definisce anche livelli di conformità API e grammatica SQL, che specificano un'ampia gamma di funzioni supportate dal driver. Per altre informazioni, vedere Livelli di conformità.
È importante ricordare che ODBC definisce un'interfaccia comune per tutte le funzioni esposte. Per questo motivo, le applicazioni contengono codice specifico per le funzioni, non per il DBMS, e possono utilizzare qualsiasi driver che esponga tali funzioni. Un vantaggio è che le applicazioni non devono essere aggiornate quando le funzioni supportate da un DBMS vengono migliorate; invece, quando viene installato un driver aggiornato, l'applicazione utilizza automaticamente le funzioni perché il suo codice è specifico della funzione, non del driver o del DBMS.