Erwägen der zu verwendenden Datenbankfunktionen
Nachdem die grundlegende Ebene der Interoperabilität bekannt ist, müssen die datenbankfeatures, die von der Anwendung verwendet werden, berücksichtigt werden. Welche SQL-Anweisungen werden beispielsweise von der Anwendung ausgeführt? Wird die Anwendung Bildlaufcursor verwenden? Transaktionen? Verfahren? Lange Daten? Ideen dazu, welche Features möglicherweise nicht von allen DBMS unterstützt werden, finden Sie in den Beschreibungen der SQLGetInfo-, SQLSet Verbinden Attr- und SQLSetStmtAttr-Funktion sowie in Anhang C: SQL Grammar. Die features, die von einer Anwendung benötigt werden, können einige DBMSs aus der Liste der Ziel-DBMSs entfernen. Möglicherweise zeigen sie auch, dass die Anwendung auf viele DBMS-Elemente ausgerichtet werden kann.
Wenn beispielsweise die erforderlichen Features einfach sind, können sie in der Regel mit einem hohen Grad an Interoperabilität implementiert werden. Eine Anwendung, die eine einfache SELECT-Anweisung ausführt und Ergebnisse mit einem Vorwärtscursor abruft, ist wahrscheinlich aufgrund ihrer Einfachheit sehr interoperabel: Fast alle Treiber und DBMSs unterstützen die benötigten Funktionen.
Wenn die erforderlichen Features jedoch komplexer sind, z. B. Bildlaufcursor, positionierte Aktualisierungs- und Löschanweisungen und Prozeduren, müssen häufig Kompromisse vorgenommen werden. Es gibt einige Möglichkeiten:
Niedrigere Interoperabilität, mehr Features. Die Anwendung enthält die Features, funktioniert aber nur mit DBMSs, die sie unterstützen.
Höhere Interoperabilität, weniger Features. Die Anwendung legt die Features ab, funktioniert aber mit weiteren DBMSs.
Höhere Interoperabilität, optionale Features. Die Anwendung enthält die Features, stellt sie jedoch nur mit den DBMSs zur Verfügung, die sie unterstützen.
Höhere Interoperabilität, mehr Features. Die Anwendung verwendet die Features mit DBMSs, die sie unterstützen, und emuliert sie für DBMSs, die dies nicht tun.
Die ersten beiden Fälle sind relativ einfach zu implementieren, da die Features entweder mit allen unterstützten DBMSs oder ohne verwendet werden. Letztere beiden Fälle hingegen sind komplexer. Es ist in beiden Fällen erforderlich, zu überprüfen, ob das DBMS die Features unterstützt, und im letzten Fall, um eine potenziell große Menge an Code zu schreiben, um diese Features zu emulieren. Daher benötigen diese Systeme wahrscheinlich mehr Entwicklungszeit und können zur Laufzeit langsamer sein.
Erwägen Sie eine generische Abfrageanwendung, die eine Verbindung mit einer einzelnen Datenquelle herstellen kann. Die Anwendung akzeptiert eine Abfrage des Benutzers und zeigt die Ergebnisse in einem Fenster an. Angenommen, diese Anwendung verfügt über ein Feature, mit dem Benutzer die Ergebnisse mehrerer Abfragen gleichzeitig anzeigen können. Das heißt, sie können eine Abfrage ausführen und einige der Ergebnisse betrachten, eine andere Abfrage ausführen und einige der Ergebnisse betrachten und dann zur ersten Abfrage zurückkehren. Dies stellt ein Interoperabilitätsproblem dar, da einige Treiber nur eine einzelne aktive Anweisung unterstützen.
Die Anwendung hat eine Reihe von Auswahlmöglichkeiten, basierend auf dem, was der Treiber für die option SQL_MAX_CONCURRENT_ACTIVITIES in SQLGetInfo zurückgibt:
Unterstützen Sie immer mehrere Abfragen. Nach dem Herstellen einer Verbindung mit einem Treiber überprüft die Anwendung die Anzahl der aktiven Anweisungen. Wenn der Treiber nur eine aktive Anweisung unterstützt, schließt die Anwendung die Verbindung und informiert den Benutzer darüber, dass der Treiber die erforderliche Funktionalität nicht unterstützt. Die Anwendung ist einfach zu implementieren und verfügt über vollständige Funktionen, weist jedoch eine geringere Interoperabilität auf.
Unterstützen Sie niemals mehrere Abfragen. Die Anwendung legt das Feature vollständig ab. Es ist einfach zu implementieren und verfügt über eine hohe Interoperabilität, verfügt aber über weniger Funktionalität.
Unterstützen Sie mehrere Abfragen nur, wenn der Treiber dies tut. Nach dem Herstellen einer Verbindung mit einem Treiber überprüft die Anwendung die Anzahl der aktiven Anweisungen. Die Anwendung ermöglicht es dem Benutzer, eine neue Anweisung zu starten, wenn eine bereits aktiv ist, wenn der Treiber mehrere aktive Anweisungen unterstützt. Die Anwendung verfügt über höhere Funktionen und Interoperabilität, ist jedoch schwieriger zu implementieren.
Unterstützen Sie immer mehrere Abfragen, und emulieren Sie sie bei Bedarf. Nach dem Herstellen einer Verbindung mit einem Treiber überprüft die Anwendung die Anzahl der aktiven Anweisungen. Die Anwendung ermöglicht es dem Benutzer immer, eine neue Anweisung zu starten, wenn eine bereits aktiv ist. Wenn der Treiber nur eine aktive Anweisung unterstützt, öffnet die Anwendung eine zusätzliche Verbindung mit diesem Treiber und führt die neue Anweisung für diese Verbindung aus. Die Anwendung verfügt über volle Funktionalität und hohe Interoperabilität, ist jedoch schwieriger zu implementieren.