Considerazione delle funzionalità di database da usare
Una volta che si conosce il livello di interoperabilità di base, è necessario considerare le funzionalità del database usate dall'applicazione. Ad esempio, quali istruzioni SQL verranno eseguite dall'applicazione? L'applicazione userà cursori scorrevoli? Transazioni? Procedure? Data estesa? Per informazioni sulle funzionalità che potrebbero non essere supportate da tutti i DBMS, vedere le descrizioni delle funzioni SQLGetInfo, SQLSetConnectAttr e SQLSetStmtAttr, e l’Appendice C: Grammatica SQL. Le funzionalità richieste da un'applicazione potrebbero eliminare alcuni DBMS dall'elenco dei DBMS di destinazione. Potrebbero anche indicare che l'applicazione può essere facilmente indirizzata a molti DBMS.
Ad esempio, se le funzionalità necessarie sono semplici, in genere possono essere implementate con un livello elevato di interoperabilità. Un'applicazione che esegue una semplice istruzione SELECT e recupera i risultati con un cursore forward-only è con probabilità altamente interoperativa in virtù della sua semplicità: quasi tutti i driver e i DBMS supportano le funzionalità necessarie.
Tuttavia, se le funzionalità necessarie sono più complesse, ad esempio cursori scorrevoli, istruzioni di aggiornamento posizionato ed eliminazione e procedure, spesso è necessario fare dei compromessi. Le possibilità sono diverse:
Interoperabilità inferiore, più funzionalità. L'applicazione include le funzionalità, ma funziona solo con DBMS che le supportano.
Maggiore interoperabilità, meno funzionalità. L'applicazione esclude le funzionalità, ma funziona con più DBMS.
Maggiore interoperabilità, funzionalità facoltative. L'applicazione include le funzionalità, ma le rende disponibili solo con quei DBMS che le supportano.
Maggiore interoperabilità, più funzionalità. L'applicazione usa le funzionalità con i DBMS che le supportano e le emula per i DBMS che non le supportano.
I primi due casi sono relativamente semplici da implementare, perché le funzionalità vengono usate con tutti i DBMS supportati o con nessuno. Gli ultimi due casi, d'altra parte, sono più complessi. In entrambi i casi è necessario verificare se il DBMS supporta le funzionalità e nell'ultimo caso scrivere una quantità di codice potenzialmente elevata per emulare queste funzionalità. Pertanto, questi schemi richiedono più tempo di sviluppo e possono essere più lenti in fase di esecuzione.
Si consideri un'applicazione di query generica in grado di connettersi a una singola origine dati. L'applicazione accetta una query da parte dell'utente e mostra i risultati in una finestra. Si supponga ora che questa applicazione abbia una funzionalità che consente agli utenti di visualizzare contemporaneamente i risultati di più query. Ovvero, gli utenti possono eseguire una query ed esaminare alcuni dei risultati, eseguire una query diversa ed esaminarne alcuni risultati e quindi tornare alla prima query. Questo presenta un problema di interoperabilità perché alcuni driver supportano solo una singola istruzione attiva.
L'applicazione include diverse opzioni, in base a ciò che il driver restituisce per l'opzione SQL_MAX_CONCURRENT_ACTIVITIES in SQLGetInfo:
Supporta sempre più query. Dopo la connessione a un driver, l'applicazione controlla il numero di istruzioni attive. Se il driver supporta una sola istruzione attiva, l'applicazione chiude la connessione e informa l'utente che il driver non supporta le funzionalità necessarie. L'applicazione è facile da implementare e ha funzionalità complete, ma ha un'interoperabilità inferiore.
Non supporta mai più query. L'applicazione esclude completamente le funzionalità. È facile da implementare e ha un'interoperabilità elevata, ma ha meno funzionalità.
Supporta più query solo se il driver lo fa. Dopo la connessione a un driver, l'applicazione controlla il numero di istruzioni attive. L'applicazione consente all'utente di avviare una nuova istruzione quando ne è già una attiva solo se il driver supporta più istruzioni attive. L'applicazione ha funzionalità e interoperabilità più elevate, ma è più difficile da implementare.
Supporta sempre più query e le emula quando necessario. Dopo la connessione a un driver, l'applicazione controlla il numero di istruzioni attive. L'applicazione consente sempre all'utente di avviare una nuova istruzione quando ne è già attiva una. Se il driver supporta una sola istruzione attiva, l'applicazione apre una connessione aggiuntiva a tale driver ed esegue la nuova istruzione su tale connessione. L'applicazione ha funzionalità complete e interoperabilità elevata, ma è più difficile da implementare.