使用するデータベース機能の検討
基本的なレベルの相互運用性がわかったら、アプリケーションで使用されるデータベース機能を考慮する必要があります。 たとえば、アプリケーションで実行される SQL ステートメントは何でしょうか。 アプリケーションはスクロール可能なカーソルを使用しますか? トランザクション? プロシージャ? 長いデータ? すべての DBMS でサポートされない機能については、SQLGetInfo、SQLSetConnectAttr、SQLSetStmtAttr 関数の説明、および付録 C: SQL 文法を参照してください。 アプリケーションに必要な機能により、一部の DBMS がターゲット DBMS の一覧から削除される場合があります。 また、アプリケーションが多数の DBMS を簡単にターゲットにできることを示している場合もあります。
たとえば、必要な機能が単純な場合、通常は高度な相互運用性で実装できます。 単純な SELECT ステートメントを実行し、前方専用カーソルを使用して結果を取得するアプリケーションは、そのシンプルさのために非常に相互運用可能である可能性があります。ほとんどのドライバーと DBMS は、必要な機能をサポートします。
ただし、スクロール可能なカーソル、位置指定更新および削除ステートメント、プロシージャなど、必要な機能がより複雑な場合は、多くの場合、トレードオフを行う必要があります。 いくつかの可能性があります。
相互運用性が低下、機能が増える。 アプリケーションには機能が含まれていますが、それらをサポートする DBMS でのみ機能します。
相互運用性が向上、機能が少なくなる。 アプリケーションは機能を削除しますが、より多くの DBMS で動作します。
相互運用性が向上、オプションの機能。 アプリケーションには機能が含まれていますが、それらをサポートする DBMS でのみ使用できるようにします。
相互運用性が向上、機能が増える。 アプリケーションは、それらをサポートする DBMS と共に機能を使用し、サポートされていない DBMS に対してそれらをエミュレートします。
最初の 2 つのケースは比較的簡単に実装できます。この機能は、サポートされているすべての DBMS と共に使用されるか、何も使用されないためです。 一方、後者の 2 つのケースはより複雑です。 どちらの場合も、DBMS が機能をサポートしているかどうかを確認し、最後のケースでは、これらの機能をエミュレートするために大量のコードを記述する必要があります。 そのため、これらのスキームでは開発時間が長くなる可能性が高く、実行時に速度が低下する可能性があります。
1 つのデータ ソースに接続できる汎用クエリ アプリケーションについて考えてみましょう。 アプリケーションはユーザーからのクエリを受け入れ、結果をウィンドウに表示します。 次に、このアプリケーションに、ユーザーが複数のクエリの結果を同時に表示できる 1 つの機能があるとします。 つまり、クエリを実行して結果の一部を調べたり、別のクエリを実行して結果の一部を調べたり、最初のクエリに戻ったりすることができます。 一部のドライバーでは 1 つのアクティブなステートメントのみがサポートされるため、相互運用性の問題が発生します。
アプリケーションには、SQLGetInfo の SQL_MAX_CONCURRENT_ACTIVITIES オプションに対してドライバーが返す内容に基づいて、さまざまな選択肢があります。
常に複数のクエリをサポートします。 ドライバーに接続した後、アプリケーションはアクティブなステートメントの数を確認します。 ドライバーが 1 つのアクティブなステートメントのみをサポートしている場合、アプリケーションは接続を閉じ、ドライバーが必要な機能をサポートしていないことをユーザーに通知します。 アプリケーションは実装が簡単で、完全な機能を備えていますが、相互運用性は低くなります。
複数のクエリをサポートしません。 アプリケーションによって機能が完全に削除されます。 実装が簡単で、相互運用性は高いですが、機能は少なくなります。
ドライバーがサポートする場合にのみ、複数のクエリをサポートします。 ドライバーに接続した後、アプリケーションはアクティブなステートメントの数を確認します。 アプリケーションでは、ドライバーが複数のアクティブなステートメントをサポートしている場合にのみ、既にアクティブな場合に、ユーザーは新しいステートメントを開始できます。 アプリケーションの機能と相互運用性は高くなりますが、実装が困難です。
常に複数のクエリをサポートし、必要に応じてそれらをエミュレートします。 ドライバーに接続した後、アプリケーションはアクティブなステートメントの数を確認します。 アプリケーションでは、ユーザーが既にアクティブな場合に、常に新しいステートメントを開始できます。 ドライバーがサポートするアクティブなステートメントが 1 つだけの場合、アプリケーションはそのドライバーへの追加の接続を開き、その接続に対して新しいステートメントを実行します。 アプリケーションは完全な機能と高い相互運用性を備えていますが、実装が困難です。