ODBC ソリューション
問題は、ODBC がデータベース アクセスをどのように標準化するかという点です。 アーキテクチャには次の 2 つの要件があります。
アプリケーションは、再コンパイルまたは再リンクすることなく、同じソース コードを使用して複数の DBMS にアクセスできる必要があります。
アプリケーションは、複数の DBMS に同時にアクセスできる必要があります。
また、マーケットプレースの現実のために、もう 1 つの問題があります。
- ODBC で公開する必要がある DBMS 機能はどれですか? すべての DBMS に共通の機能、または任意の DBMS で使用可能な機能のみ
ODBC では、次の方法でこれらの問題が解決されます。
ODBC は呼び出しレベルのインターフェイスです。 アプリケーションが同じソース コードを使用して複数の DBMS にアクセスする方法の問題を解決するために、ODBC は標準 CLI を定義します。 これには、Open Group および ISO/IEC の CLI 仕様のすべての機能が含まれており、アプリケーションで一般的に必要とされる追加の機能が提供されます。
ODBC をサポートする DBMS ごとに異なるライブラリ (ドライバー) が必要です。 ドライバーは、ODBC API で関数を実装します。 別のドライバーを使用するには、アプリケーションを再コンパイルまたは再リンクする必要はありません。 代わりに、アプリケーションは単に新しいドライバーを読み込み、その中の関数を呼び出します。 複数の DBMS に同時にアクセスするために、アプリケーションは複数のドライバーを読み込みます。 ドライバーのサポート方法はオペレーティング システム固有です。 たとえば、Microsoft Windows オペレーティング システムでは、ドライバーはダイナミック リンク ライブラリ(DLL)です。
ODBC では、標準の SQL 文法が定義されています。 ODBC では、標準の呼び出しレベル インターフェイスに加えて、標準の SQL 文法が定義されています。 この文法は、Open Group SQL CAE 仕様に基づいています。 2 つの文法の違いは軽微であり、主に埋め込み SQL (Open Group) と CLI (ODBC) で必要な SQL 文法の違いが原因です。 また、一般的に使用できる言語機能を公開するための文法の拡張機能もいくつか用意されています。この機能は、Open Group の文法ではカバーされていません。
アプリケーションは、ODBC または DBMS 固有の文法を使用してステートメントを送信できます。 ステートメントで DBMS 固有の文法とは異なる ODBC 文法が使用されている場合、ドライバーはデータ ソースに送信する前に変換します。 ただし、ほとんどの DBMS では標準 SQL 文法が既に使用されているため、このような変換はまれです。
ODBC には、複数の DBMS への同時アクセスを管理するためのドライバー マネージャーが用意されています。 ドライバーを使用すると、複数の DBMS に同時にアクセスする問題が解決されますが、これを行うコードは複雑になる可能性があります。 すべてのドライバーで動作するように設計されたアプリケーションは、どのドライバーにも静的にリンクすることはできません。 代わりに、実行時にドライバーを読み込み、関数ポインターのテーブルを介して関数を呼び出す必要があります。 アプリケーションが複数のドライバーを同時に使用する場合、状況はより複雑になります。
ODBC は、各アプリケーションにこれを強制するのではなく、ドライバー マネージャーを提供します。 ドライバー マネージャーは、すべての ODBC 関数 (主にドライバーの ODBC 関数へのパススルー呼び出し) を実装し、アプリケーションに静的にリンクされるか、実行時にアプリケーションによって読み込まれます。 したがって、アプリケーションは、各ドライバーのポインターではなく、ドライバー マネージャーで名前によって ODBC 関数を呼び出します。
アプリケーションが特定のドライバーを必要とする場合、最初にドライバーを識別する接続ハンドルを要求してから、ドライバー マネージャーがドライバーを読み込むよう要求します。 ドライバー マネージャーは、ドライバーを読み込み、ドライバー内の各関数のアドレスを格納します。 ドライバーで ODBC 関数を呼び出すために、アプリケーションはドライバー マネージャーでその関数を呼び出し、ドライバーの接続ハンドルを渡します。 その後、ドライバー マネージャーは、前に格納したアドレスを使用して関数を呼び出します。
ODBC では、多数の DBMS 機能が公開されていますが、ドライバーですべての機能をサポートする必要はありません。 ODBC がすべての DBMS に共通する機能のみを公開している場合は、ほとんど使用できません。結局のところ、今日、多くの異なる DBMS が存在する理由は、それらが異なる機能を持っているということです。 ODBC が任意の DBMS で使用可能なすべての機能を公開した場合、ドライバーを実装することはできません。
代わりに、ODBC は多数の機能 (ほとんどの DBMS でサポートされている機能以上のもの) を公開しますが、ドライバーではそれらの機能のサブセットのみを実装する必要があります。 ドライバーは、基になる DBMS でサポートされている場合、またはエミュレートすることを選択した場合にのみ、残りの機能を実装します。 従って、アプリケーションは、そのDBMS用のドライバによって公開される単一のDBMSの機能を利用するように書いたり、すべてのDBMSで使用される機能だけを使用したり、特定の機能のサポートをチェックしてそれに応じて対応したりすることができます。
アプリケーションでドライバーと DBMS がサポートする機能を特定できるように、ODBC には、ドライバーと DBMS の機能に関する一般的な情報とドライバーがサポートする関数の一覧を返す 2 つの関数 (SQLGetInfo と SQLGetFunctions) が用意されています。 ODBC では、ドライバーでサポートされる幅広い機能を指定する API および SQL 文法の準拠レベルも定義されています。 詳細については、整合性レベルをご覧ください。
ODBC では、公開されているすべての機能に共通のインターフェイスが定義されていることに注意してください。 このため、アプリケーションには DBMS 固有のコードではなく機能固有のコードが含まれており、それらの機能を公開するドライバーを使用できます。 この利点の 1 つは、DBMS でサポートされる機能が強化されたときにアプリケーションを更新する必要ができないことです。代わりに、更新されたドライバーがインストールされると、そのコードはドライバー固有または DBMS 固有ではなく機能固有であるため、アプリケーションは自動的に機能を使用します。