Silverlight をインストールするには、ここをクリックします*
Japan変更|すべてのMicrosoft のサイト|サインイン
MSDN*
マイクロソフト サイトの検索:
|MSDN ライブラリ|デベロッパー センター|ダウンロード情報|開発ツール製品|コミュニティ|ご意見・ご要望|サイトマップ
MSDN Home > 連載コラム > Data Interface Objects 101

Data Interface Objects 101

Microsoft Corporation

March 30, 1999
日本語版最終更新日 1999 年 11 月 4 日

以前のコラムで、データベースの基本についてお話しました。データベースがどういうものか、どうしてデータベースがないと困るのかは、すでに説明したとおりです。次のステップとして、今回は、Web ページやアプリケーションからデータベース内のデータにアクセスし、処理するための仕掛け、つまりデータ オブジェクトについて取り上げます。


この記事では、各種のデータ オブジェクトについて説明し、その後、「これらのデータオブジェクトを使用する場面」、「データ オブジェクトが便利な理由」を解説していきます。

データ オブジェクトは混乱しやすい -- データ オブジェクトは、ADO と DOA の違いは何かとか、ODBC で何をしなければならないかとか覚えにくい頭文字が使われているので、区別しにくいところがあると思います。そこで、この記事では、まず各種のデータ オブジェクトを取り上げ、それぞれについて説明します。その後、「これらのデータ オブジェクトを使用する場面」、「データ オブジェクトが便利な理由」を解説していきます。

定義

最初に、この記事で使用する用語に触れておく必要があります。自分の知らない略語が出てきたら、まず、glossary を参照してください。このページの用語集には、ユーザーが知りたい略語や用語を全て網羅しているわけではありませんが、通常使われるものは殆ど見つかるはずです。この記事で取り上げた用語の多くは、「Welcome to Acronym Hell Non-MSDN Online link」という記事にも定義が載っています。さらに興味をお持ちの方は、Microsoft の Universal Data Access (UDA) Web サイト Non-MSDN Online linkを訪れてください。Microsoft のデータ アクセス戦略について豊富な情報が掲載されています。

次の用語は、この記事を理解するための基本となります。

Microsoft の Universal Data Access ファミリ

  • Microsoft Data Access Components (MDAC) は、Web やローカル エリア ネットワークなど企業全体で使われているあらゆるデータにアクセスするためのコンポーネントです。MDAC は、ADO、RDS、ODBC、Microsoft OLE DB Provider for ODBC からなりますが、さながらデータ アクセスに関係する略語のオンパレードです。これらのコンポーネントは、いずれもリリース済みで、勿論、ドキュメントも整備され、サポートも行われています。
  • OLE for Databases Non-MSDN link (OLE DB) は、全社的規模でデータ オブジェクトにアクセスするためのインターフェイスの集まりです。OLE DB は、ネットワーク上での通信をはじめ、単一マシン上のプロセス間通信も扱える設計になっています。
  • ActiveX Data Objects Non-MSDN link (ADO) は、Web ベースのアプリケーションまたはデータベース アプリケーションで使用できるオブジェクト ベースのデータ インターフェイスの集まりです。ADO は、OLE DB が提供するインターフェイス周りのラッパーとして機能し、スクリプトを含むあらゆる COM 対応言語でデータを扱うことを可能にします。ADO インターフェイスを利用することにより、クライアント マシン上のデータであれ、ローカル エリア ネットワーク (LAN) や Web サーバー上のデータであれ、異なるさまざまな型のデータをより簡単に処理できるようになります。これらのインターフェイスは、Microsoft Internet Information Server (IIS)、Visual C、Visual Basic®、Microsoft Visual InterDev™ にと同梱されています。したがってこれらのツールをすでに所有している場合は、すぐにも利用することができます。なお、MDAC Web サイト Non-MSDN linkでも一連のインターフェイス群を入手することができます。ADO は、高速で使いやすいうえに、コンピュータ上の占有リソースもわずかで済みます。
  • Remote Data Service Non-MSDN link (RDS) は、ADO と一緒に使用します。ADO は、RDS のサービスを使って、インターネットまたは企業ネットワーク上のデータベースにアクセスすることができます。Web 開発者は、RDS を使って、サーバーからクライアントまたは Web ページにデータを移動し、クライアント上でデータを処理し、更新したデータをサーバーに送信できます (単一ラウンドトリップ)。RDS は、Microsoft Data Access Components の一要素であり、IIS などのコンポーネントをホストする製品をインストールしたときに自動的にインストールされ、システムに登録されます。
  • Open Database Connectivity Non-MSDN link (ODBC) は、C 言語からデータ アクセスをするために設計された標準の低水準アプリケーション プログラミング インターフェイス (API) です。ODBC は、データベースにアクセスするための言語に Structured Query Language (SQL) を使用します。特定の ODBC ドライバを使用する場合には、データ ソース名 (DSN) をコントロール パネルから指定します。

Java Database Connectivity

  • Java Database Connectivity Non-MS link (JDBC) は、ODBC をベースにしたデータ アクセス インターフェイスで、Java プログラミング言語から使用します。JDBC は、SQL ステートメントの実行用に使われる API で、Sun Microsystems が開発したものです。JDBC についての詳細は、Sun Microsystems の Web サイトで Java テクノロジ関連のページ Non-MS linkを参照してください。

Data Access Objects

  • Data Access Objects (DAO) は、Microsoft Access (.mdb) データベース上のデータベース オブジェクトをターゲットにアクセスと操作を行うために使われるプログラミング インターフェイスです。

ODBC: データベース コネクティビティの標準

ODBC がどのようなものかは上記の定義から想像がつきますが、その存在理由まではおそらくわかっていないと思います。かつては、多くの企業が単一のデータベース管理システム (DBMS) を用意し、そのシステム専用に書かれたフロントエンドアプリケーションを使ってデータベースにアクセスしていました。それは巨大な岩のようなシステムでした。やがて、企業には、より安価なもの、より高速なもの、あるいは企業の整理統合によって思いがけず手に入ったソフトウェアなど多様な DBMS が同居するようになりました。この組み合わせにパーソナル コンピュータが加われば、企業は、さまざまなツールやデータベースを使う異種コンピュータの混在環境に行き着くことになります。この辺から、企業は、使用するツールも異なるさまざまなシステムからアクセスできるデータベースの必要性を切実に感じるようになりました。

このような多様なコンピュータを相手にするデータベースソフトウェアの開発担当者は、使用する DBMS 毎に特化したアプリケーションのバージョンを作成し、DBMS 固有のコードを書く必要に迫られました。こうしたアプリケーションを作成し、デバッグ、保守する作業は悪夢でした。アプリケーションのコードを書き直さなくても異なる DBMS の情報にアクセスできる方法の登場は、開発者にとって切実な願いでした。ODBC の登場にはこのような背景があります。

ODBC とは?

ODBC は、データアクセスオブジェクトの作成に使われる API です。Microsoft Windows Open Services Architecture (WOSA) をベースにした業界標準のインターフェイスでもあります。ODBC には、API、ドキュメント、データソースアドミニストレータ (Windows NT や Windows 95 のコントロール パネルから使用します)、ドライバ、テスト用のツール類、およびサンプルが含まれます。データソースアドミニストレータは、データソース名の設定や使用するドライバの指定、タイムアウト値の設定など、データソースの管理に使われます。ODBC ドライバは、特定のデータベース管理サービス用の ODBC API を実装したファイルです。テストツールは、データベースアクセスを詳細設定するためのツールです。サンプルは、ODBC API の一般的な使用法を実例で学べるように提供されています。詳細については、ドキュメント Non-MSDN linkを参照してください。

ODBC は、同じソース コードの 1 つのアプリケーションで、さまざまな DBMS にアクセスできるように設計されています。ODBC を使用するデータベース アプリケーションは、ODBC インターフェイスから関数を呼び出します。このインターフェイスは、データベース固有のモジュール (ドライバ) と協調動作するように実装されています。これにより、自分のデータベース アクセス コードを特定のデータベースの個別性から隔離することができます。この関係は、プリンタへの書き込みを行うアプリケーションを書く場合に類似しています (プリンタへの書き込みは、Win32 API を使ってプリンタ ドライバへの呼び出しを行います)。開発者はすべてのプリンタに共通するコードを書けばよく、後は、ドライバがそのコードを特定のプリンタに理解できる形式に変換してくれます。

ODBC と DAO

ODBC は、ODBC ドライバを使用する任意のアプリケーションから (ローカルまたはリモートの) データ ソースにアクセスすることができます。ODBC ドライバは、16 ビットと 32 ビット システム用の両方が用意され、各種のデータ ソースに幅広く使用できます。DAO は、Microsoft Jet データベース エンジンを使用するデータベース (Microsoft Access など) で最高の能力を発揮します。Microsoft Access データベースを使用する場合は、DAO の方がODBC よりもはるかに高速です。一方、扱うデータ ソースの種類が多い場合には、ODBC がより一般的なソリューションとなります。

OLE DB

OLE DB は、さまざまなデータ ソースに全社規模でアクセスするための基盤となるテクノロジです。これは、データベースが Web サーバー上や LAN 上の他のマシンに置かれている場合でもそのデータにアクセスできることを意味します。OLE DB は、最も基本的なデータ コネクティビティ サービスを提供し、OLE DB の再配布に必須のいくつかのコア コンポーネントで構成されています。再配布についての詳細は、関連のドキュメントを参照してください。現在は、Oracle、ODBC、および SQL Server 用の OLE DB プロバイダが利用できます。Microsoft Jet データベースにも対応した OLE DB プロバイダも存在しています。

ADO と RDS の使用法

以上で用語の意味はおわかりになったかと思います。次は、これらのオブジェクトを使って何をするかです。簡単に言ってしまえば、データベースのデータをアプリケーションや Web ページにくっつけることが出来るのです。これらのオブジェクトを使わなくてもデータを操作することはできますが、その場合は、ため息のでるような複雑な作業をすべて自分 (のコード) でおこなわなければばなりません。このような、オブジェクトを使用すれば、実データそのものやデータの見せ方の実装に専念することができます。

ADO が提供する組み込みオブジェクト

  • Connection このオブジェクトは、データ ソースへの接続を表します。このオブジェクトを使用することで、SQL コマンドやデータを返すステートメントなどのコマンドを (Execute メソッドを介して) 実行することができます。コマンドからデータ行が返されると、Recordset オブジェクト (下記参照) が作成されます。
  • Command このオブジェクトは、データ ソース (データベースなど) の処理対象となるコマンド (たとえば、SQL クエリーやアプリケーション ステートメントなど) を表します。コマンドは、(たとえば、どのテーブルを開くかを指定する) パラメータを渡すことができます。Row を返すコマンドと返さないコマンドがあります。
  • Parameter このオブジェクトは、コマンド オブジェクトが使用するパラメータを表します。たとえば、テーブルを「開く」ためのコマンドを送る場合は、Parameter オブジェクトを使って、対象となるテーブルの名前を指定します。
  • Recordset このオブジェクトはレコードセットを表します。レコードセットはデータベース用語で、Row セットに格納されたデータを表します。たとえば、机の上に rolodex (小型の回転式卓上名刺ファイル) があって (このようなしゃれた手の平サイズのコンピュータを買ったことはないと思うのでつい...)、ファイルをくまなく調べて、ベビーシッターの名刺を全部取り出す場合を考えてください。これがデータベース トランザクションであれば、rolodex に入っているベビーシッターを全部見つけ出すコマンド (SQL クエリー) を使用することになるでしょう。そのコマンドから返される情報が、あなたが望んだ Row セット (つまりレコードセット) ということになります。
  • Field このオブジェクトは、Recordset オブジェクト内の 1 つの列を表します。
  • Error このオブジェクトはデータ ソースによって返されるエラーを表しますが、1 回のメソッド呼び出しで複数のエラーが返される場合に使います。メソッドが返すエラーが 1 つだけの場合は、COM ベースの言語 (Visual Basic や C++ など) で使われる通常の方法でエラーを返すことができます。

以上の組み込みオブジェクトを使用することにより、データソース (サーバー上のデータベース) をセットアップし、データベースに接続して、情報を取り出すことができます。データベースとの接続には Connection オブジェクト、情報を取り出すには Command オブジェクトと Parameter オブジェクトを使用します。結果として返される Recordset オブジェクトを使えば、データの処理方法を工夫できます。(上の例のベビーシッター料金など) どれか 1 つの列を処理したいときには、Field オブジェクトを使ってこの列を基準にデータをソートすることができます。1 回の呼び出しで複数のエラーを受け取る場合には (データベース コマンドが何らかの理由で正常終了しなかったり、他に問題がある場合には)、Error オブジェクトを使って問題の原因を調べることができます。ADO についての詳細は、ドキュメント Non-MSDN linkを参照してください。

ADO は、Visual Basic や Visual C++ などの標準のプログラミング言語を使ってプログラミングすることができます。Visual J++ も使用できます。これらの言語では、Windows Foundation Classes を使用します。スクリプトを利用して ADO を取り込むこともできます。ADO に付属のドキュメントには、上述の言語やツールを使用したサンプルを豊富に用意して、ADO プログラミング モデルについてわかりやすく解説したとても役に立つチュートリアル Non-MSDN linkが含まれています。また、アクティブ コネクションの使用法やコマンドの実行方法、データの転送やフィルタリングの方法などを示す ADO コード例も満載されています。下記のコードは、Visual Basic を使ってコネクションの確立、SQL ステートメントの作成、実行を行っているサンプルです。

Public Sub main()

Dim conn As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim rs As New ADODB.Recordset

' コネクションの確立
conn.Open "DSN=pubs;uid=sa;pwd=;database=pubs"

' SQL コマンドの作成
Set cmd.ActiveConnection = conn
cmd.CommandText = "SELECT * from authors"

' 実行
rs.CursorLocation = adUseClient
rs.Open cmd, , adOpenStatic, adLockBatchOptimistic

' データの操作
rs!au_lname.Properties("Optimize") = True
rs.Sort = "au_lname"
rs.Filter = "phone LIKE '415 5*'"
rs.MoveFirst
Do While Not rs.EOF
    Debug.Print "Name: " & rs!au_fname & " "; rs!au_lname & _
        "Phone: "; rs!phone & vbCr
    rs!phone = "777" & Mid(rs!phone, 5, 11)
    rs.MoveNext
Loop

' データの更新 (転送)
conn.BeginTrans

' 更新の終了
On Error GoTo ConflictHandler
rs.UpdateBatch
On Error GoTo 0

conn.CommitTrans

Exit Sub

' 更新の終了
ConflictHandler:

rs.Filter = adFilterConflictingRecords
rs.MoveFirst
Do While Not rs.EOF
    Debug.Print "Conflict: Name: " & rs!au_fname; " " & rs!au_lname
    rs.MoveNext
Loop
conn.Rollback
Resume Next

End Sub

RDS

RDS は、クライアントからのデータの転送、操作、およびサーバーへの再送を 1 回のラウンドトリップ (往復) で行えるサービスを ADO に提供します。RDS では、データの転送に使用するプロキシを指定することもでき、デフォルトのサーバー プログラムを利用して指定のデータを自動的に取得することができます。RDS のドキュメントには、単純な RDS アプリケーションを作成するためのチュートリアルが含まれています。

これでおしまい!

今回は以上でおしまいです。それほど難しい内容ではありませんが、これらの略語をきちんと整理して覚えておくのは結構大変です。それがうまくできたら (たとえば、ADO と DAO の違いをしっかりと理解しておけば)、データ アクセスの機能はすぐに理解できるようになるでしょう。希望的観測ですが、これらのオブジェクトの全体像はつかめたでしょうし、その利用価値を判断できるだけのものは身に付いたのではと思います。

私ですか? 略語でもう頭がいっぱいです。気分転換をしなければと思っています。いっそのこと書くのをやめて、目新しいスポーツでも (ローラーダービーのことですが) やろうかと考えているところです。


Microsoft