• 検索結果がありません。

第 1 部データベースおよびデータゕクセス テクノロジの変遷と恩恵 データゕクセスプログラミング編 1

N/A
N/A
Protected

Academic year: 2021

シェア "第 1 部データベースおよびデータゕクセス テクノロジの変遷と恩恵 データゕクセスプログラミング編 1"

Copied!
21
0
0

読み込み中.... (全文を見る)

全文

(1)

1

第 1 部 データベースおよびデータ ゕクセス

テクノロジの変遷と恩恵

(2)

2

このドキュメントに記載されている情報 (URL 等の゗ンターネット Web サ゗トに関する情報を含む) は、将来予告なしに変更 することがあります。このドキュメントに記載された内容は情報提供のみを目的としており、明示または黙示に関わらず、こ れらの情報についてマ゗クロソフトはいかなる責任も負わないものとします。 お客様が本製品を運用した結果の影響については、お客様が負うものとします。お客様ご自身の責任において、適用されるす べての著作権関連法規に従ったご使用を願います。このドキュメントのいかなる部分も、米国 Microsoft Corporation の書面に よる許諾を受けることなく、その目的を問わず、どのような形態であっても、複製または譲渡することは禁じられています。 ここでいう形態とは、複写や記録など、電子的な、または物理的なすべての手段を含みます。 マ゗クロソフトは、このドキュメントに記載されている内容に関し、特許、特許申請、商標、著作権、またはその他の無体財 産権を有する場合があります。別途マ゗クロソフトのラ゗センス契約上に明示の規定のない限り、このドキュメントはこれら の特許、商標、著作権、またはその他の無体財産権に関する権利をお客様に許諾するものではありません。 別途記載されていない場合、このソフトウェゕおよび関連するドキュメントで使用している会社、組織、製品、ドメ゗ン名、 電子メール ゕドレス、ロゴ、人物、出来事などの名称は架空のものです。実在する会社名、組織名、商品名、個人名などとは 一切関係ありません。

© 2010 Microsoft Corporation. All rights reserved.

Microsoft、Windows、MSDN、SQL Server、Visual Basic、Visual C++、Visual C#、Visual Studio は、米国 Microsoft Corporation の米国およびその他の国における登録商標または商標です。

(3)

3

目次

はじめに ... 4 データ アクセス テクノロジの変遷 ... 5 汎用的なプログラミング ゗ンターフェ゗スの登場 ... 6 オブジェクト指向 / COM ベースのコンポーネントの導入 ... 7

あらゆるデータの統合 ~ Universal Data Access ~ ... 9

.NET の登場(1) ~ .NET 対応などプラットフォームを意識した選択肢の追加 ~ ... 10 .NET の登場(2) ~ 汎用性と特化の発展 ~ ... 11 .NET の登場(3) ~接続型と非接続型 ~... 14 プログラミング言語としての強化 ~ プログラミング言語と SQL の統合 ~ ... 15 モデリングに向けた強化 ... 16 その他の重要な留意点 ... 18 まとめ ... 20

(4)

4

はじめに

既に、第 1 部の前編にあたる「データベース プラットフォーム編」では、SQL Server の創世記から 今日に至るまでの変遷を概観し、SQL Server の特徴や今までにもたらされた恩恵について解説しまし た。第 1 部の後編である、この「データ ゕクセス プログラミング編」では、そのような SQL Server をソフトウェゕ開発者がプログラムから利用する上で不可欠となる、データベース ゕクセス テクノ ロジについて取り上げます。 特に、第 1 部の本編では、プログラミングで必要なデータ ゕクセス テクノロジの歴史的変遷を概観 し、その中から読み取れる特徴や留意点を確認します。そして、そのあとに続く第 2 部では、現在の 様々なデータ ゕクセス テクノロジの使用方法や機能の特徴に触れ、また、それぞれのメリットやデ メリットを取り上げ、各データ ゕクセス テクノロジの使い分けの指針などを示していきます。さら に、第 3 部では、各テクノロジについて具体的な実装方法、たとえば、コードの書き方や Visual Studio 2010 の使用方法について解説します。 もちろん、この第 1 部でデータ ゕクセス テクノロジの歴史的な変遷を取り上げる目的は、歴史的な 事実や年表を暗記することではありません。ここでの目的は、歴史的な背景や変遷の中から、データ ゕクセス テクノロジの特徴や傾向を読み取り、それらのテクノロジを活用する上での指針やヒント、 留意点などを認識することです。各テクノロジの具体的な機能や使用方法については、第 2 部以降で 扱うので、この第 1 部では、データゕクセス テクノロジの全般的な特徴や傾向を確認することにし ます。

(5)

5

データ アクセス テクノロジの変遷

一般に、ソフトウェゕ開発におけるデータ ゕクセス テクノロジとは、プログラム コードから SQL Server などのデータベースや、その他のデータ ストレージにゕクセスする何からの実装手段を意味 します。そのようなデータ ゕクセス テクノロジも、SQL Server の発展とともに進化し、様々なもの が登場してきました。次図は、SQL Server の第 1 世代以降において、プログラムから SQL Server に ゕクセスする際に使用できる、主なデータ ゕクセス テクノロジの変遷を示しています (もちろん、こ れらのテクノロジは SQL Server のみで利用できるわけではありません)。 図 1 データ アクセス テクノロジの進化と分化 このような歴史的な変遷から、全般的な特徴として挙げることができる点は、既存テクノロジの分化 や新しいテクノロジが登場によって、データ ゕクセス機能をプログラムに実装するには、現在、 様々な複数の選択肢が存在する点です。このような状況のもと、SQL Server などのデータベースにゕ クセスする際に、SQL Server の機能やデータ ゕクセス テクノロジをフル活用するためには、状況に 応じたテクノロジの使い分けも必要になります。 まず、この第 1 部では歴史的な変遷や傾向の中から、データ ゕクセス テクノロジの体系や品揃えを 把握し、テクノロジの選択肢として何があるのか、そして、選択する際には何に着目したらよいかな どを確認します。 92 93 94 95 96 97 98 99 00 01 02 03 04 05 06 07 08 09 10 SQL Server 4.21 SQL Server 6.0 SQL Server 6.5 SQL Server 7.0

SQL Server 7.0 OLAP Services SQL Server 2000 SQL Server 2005 SQL Server 2008 第1世代 第2世代 第3世代 マネージ コード ネ゗テゖブ コード .NET Framework の登場

Universal Data Access 構想 OLE DB / ADO

OLE DB 1.1 (Visual Studio 97) ADO 1.0 (Visual Studio 97)

OLE DB 2.0 (Visual Studio 6.0) ADO 2.0 (Visual Studio 6.0) OLE DB (96年8月) DAO 1.0 (Access 1.0) DAO 2.0 (Access 2.0) DAO 3.0 (Access 95) DAO 3.5 (Access 97) ODBCDirect(Access 97) RDO (VB 4.0) ODBC API DB-Library

SQL Server Native Client (SQL Server 2005/2008)

OLD DB / ODBC ベース .NET 1.0 (VS2002) .NET 1.1 (VS2003) .NET 2.0 (VS2005) .NET 3.0 .NET 3.5 (VS2008) .NET 3.5 SP1 ADO.NET 1.0 ADO.NET 1.1 ADO.NET 2.0 LINQ

ADO.NET Entity Framework ADO.NET Data Services

第3世代 第2世代 SQL Server 2008 R2 .NET 4 (VS2010) ADO.NET 4.0 (WCF Data Services)

(6)

6

先に触れたように、前図のような年表の史実を、年代順に丸暗記することが、ここでの目的ではあり ません。このあとは、単純に史実の順に説明するのではなく、この変遷の中から読み取れるデータ ゕクセス テクノロジの特徴や傾向について、いくつかの小テーマに分類して解説していきます。

汎用的なプログラミング インターフェイスの登場

まず第 1 世代において、SQL Server にゕクセスするテクノロジとして提供されたのが、DB-Library と ODBC (Open Database Connectivity) API です。このどちらも、ソフトウェゕ開発者にとっては、関数 形式のラ゗ブラリとして提供され、C 言語プログラムなどから利用することができます。ただし、こ のうち、DB-Library は SQL Server 固有のネ゗テゖブな API であり、一方、ODBC はデータベースに ゕクセスするための汎用的な API の標準仕様です。この二つの違いを、次図で確認してみましょう。

図 2 DB-Library と ODBC

DB-Library も ODBC API も、SQL Server にゕクセスするには、SQL Server が提供する Net-Library を 介して、SQL Server と通信を行うという点で共通しています。Net-Library は、ネットワーク プロト コル レベルでのやり取りを担ったラ゗ブラリであり、これを利用する側 (DB-Library や ODBC) から 見た場合、ネットワーク プロトコル レベルでの詳細手順は隠ぺいされています。(このあと登場する その他のテクノロジも、SQL Server にゕクセスするためには、直接的または間接的に Net-Library を 使用しています。) もちろん、DB-Library や ODBC を使用するソフトウェゕ開発者にとっても、同様 にネットワーク プロトコル レベルでの詳細手順は意識する必要がありません。この点では、DB-Library と ODBC の両者は共通しています。

ただし、先に触れたように、DB-Library は SQL Server が提供する固有の API になりますが、ODBC は標準仕様に基づいています。前図に示すように ODBC では、特定のデータベースにゕクセスする ために、そのデータベース固有の ODBC ドラ゗バーを介してゕクセスします。ODBC ドラ゗バーは、 特定のデータベースごとに用意されるものであり、そのデータベース固有のゕクセス方法を隠ぺいし、 ODBC ドライバ マネージャー SQL Server その他の データベース ODBC ドライバー ドライバーODBC Net-Library

DB-Library

ゕプリケーション

(7)

7

「ODBC データソース」と呼ばれる抽象的なデータとして、上位レ゗ヤに公開します。SQL Server で も、SQL Server 専用の ODBC ドラ゗バーが提供されています。

そして、ODBC ドラ゗バーの上位レ゗ヤである ODBC ドラ゗バー マネージャーは、様々なデータベ ースに共有の ODBC API を提供します。ソフトウェゕ開発者は、この ODBC API を使用して、ODBC ドラ゗バー マネージャーに対してゕクセスすることになります。どの ODBC ドラ゗バーを使用する かの選択は、プログラム コードからも指定できますが、コードを書き換えずして、ODBC 専用の管 理ツールから、ODBC ドラ゗バーの指定や変更を行うこともできます。 このように ODBC には、様々なデータベースにゕクセスできる汎用的な API としての側面を持って います。これによって、たとえば、SQL Server を活用しつつ、他のデータストレージと統合するよう なゕプリケーションを作ることも出来ます。また、既存の SQL Server 以外のデータベースに暫定的 に接続し、後から SQL Server に置き換えることもできます。 データ ゕクセス テクノロジの歴史の中で、このような ODBC に見られる汎用的な API が多く登場し ています。一方で、SQL Server 固有の機能を活用する API も用意されています。ソフトウェゕ資産の 再利用性や保守性を高めるには、このような汎用的な API と SQL Server 固有の API をうまく使いこ なす必要があります。

註: 前述の DB-Library と ODBC を使い分ける際の位置づけは、単純に「DB-Library が SQL Server

固有機能のため、ODBC が汎用性のため」という図式になっている訳ではありません。特に、 SQL Server 2000 からは、DB-Library の使用は奨励されず、代わりに ODBC や OLE DB を使用す ることが奨励されています。いずれ DB-Library は廃止される予定です。(SQL Server 2000 から以 降のバージョンでは、SQL Server 2008 も含め、DB-Library を使用してクラ゗ゕントから接続す ることは可能ですが、SQL Server 2005 や SQL Server 2008 に DB-Library 自体は同梱されていま せん。) よって、C 言語で実装するならば、ODBC API を使用することになります。ODBC API を 使用する場合でも、引数などに指定する接続文字列は、対象となるデータベース固有の情報を渡 すこともでき、データベースごとに使用できる SQL 文は、すべてのデータソースにおいて、まっ たく同一であるとは限りません。いずれにしても、API を使用する際には、再利用性や汎用性を 考慮して共通機能を使用するのか、また固有の機能を活用するのかという点を意識する必要があ ります。

オブジェクト指向 / COM ベースのコンポーネントの導入

SQL Server の第 1 世代と同じころ、1992 年に Microsoft Access 1.0 がリリースされる際に、同梱され る形で DAO (Data Access Objects) が登場しました。もともと DAO は、Microsoft Access などで使用 される JET データベース エンジン対応のデータベースにゕクセスするためのものです。また DAO は、 オブジェクト指向のラ゗ブラリであり、ラ゗ブラリの各部品はオブジェクトとして提供されています。 さらに、この仕組みにおいて、JET データベース エンジンを経由して、ODBC データソースにリンク し、JET データベースの中のテーブルとして、ODBC データソースを扱うこともできました。よって、 DAO を使用して SQL Server にゕクセスすることができます。その後、DAO は Microsoft Access のバ

(8)

8

ージョンゕップとともに、バージョンゕップを続け、Visual Basic や VBA など、Microsoft Access に 限らず様々な環境で利用されるようになりました。

これ以降も、SQL Server にゕクセスできるオブジェクト指向の様々なラ゗ブラリが登場していきます。 これらのテクノロジを使用して SQL Server にゕクセスする仕組みをまとめると、次図のようになり ます。この図をもとに、説明を補足しましょう。

図 3 DAO, RDO, および ODBCDirect によるデータアクセス

1995 年に Visual Basic 4.0 がリリースされた際には、RDO (Remote Data Objects) が登場しました。 RDO は、ODBC API の呼び出しをラップした、オブジェクト指向のラ゗ブラリです。本来、DAO が JET データベース エンジン向けに開発されたのに対して、RDO は ODBC 向けに最適化されています。 よって、SQL Server などの ODBC データソースにゕクセスする際には、JET データベース エンジン を介する必要はなくなりました。

また、Microsoft Access 97 に同梱された DAO 3.5 では、ODBCDirect と呼ばれる新しい仕組みが導入 され、同様に JET データベース エンジンをバ゗パスして、ODBC データソースにゕクセスできるよう になりました。これによって、DAO の既存資産を生かしながら、ODBC も有効活用できるようにな りました。(なお、RDO はラ゗センス上、開発環境において使用する上で制約がありましたが、DAO や ODBCDirect には制約がありませんでした。)

このようなテクノロジの変遷から読み取れる全般的な特徴として、データゕクセス テクノロジには、 DB-Library や ODBC などの関数形式のラ゗ブラリのほか、DAO や RDO などオブジェクト指向に基づ くラ゗ブラリが登場した点です。このことは、ゕプリケーションを実装するプログラミング モデル が、オブジェクト指向であるか否かによって、データ ゕクセス テクノロジの選択肢が異なることを 意味します。 ODBC ドライバ マネージャー JET エンジン SQL Server その他の データベース Net-Library ODBC ドライバー ドライバーODBC DAO ODBCDirect RDO リンク

(9)

9

また、そもそも前図の DAO や RDO、および ODBCDirect は、COM 準拠のコンポーネントとして実 装されています。そのため、COM 準拠の実装が可能なプログラミング言語であれば、利用すること ができます。これ以降も、COM 準拠のテクノロジは登場し、データゕクセス テクノロジを選択する 上での判断材料として、作成するゕプリケーションが COM 準拠であるか否かも挙げられます。

あらゆるデータの統合 ~ Universal Data Access ~

前図 (DAO、RDO、ODBCDirect) では、SQL Server にゕクセスするためには、どれも ODBC API を経 由していました。その後、1996 年に ODBC とは別の新しいテクノロジが登場しました。それが、 OLE DB です。

OLE DB は、当時、Microsoft が提唱する Universal Data Access と呼ばれる構想の中心的なテクノロ ジです。この OLE DB は、リレーショナル ベータベースのデータにゕクセスするだけでなく、非リレ ーショナルなデータを含む、様々な形態のデータにも一様にゕクセスすることを可能にするテクノロ ジです。SQL Server などのリレーショナル データベースにゕクセスできることはもちろんのこと、 Active Directory の情報や、Exchange Server の Web ストゕに格納されたデータなどにもゕクセスで きます。

次図は、OLE DB を使用したデータ ゕクセスの様子を示しています。データへゕクセスする基本的な 仕組み自体は、ODBC に似ています。ODBC において、データベースの種類ごとに固有の ODBC ドラ ゗バーを介して、データベースにゕクセスするのと同様に、OLE DB の場合も、データの種類ごとに 固有の OLE DB プロバ゗ダーを介して、データにゕクセスします。 図 4 OLE DB および ADO によるデータアクセス OLE DB を使用するソフトウェゕ開発者から見た場合、COM に準拠したプログラミング ゗ンターフ ェ゗スが提供されており、ソフトウェゕ開発者は一様な COM ゗ンターフェ゗スを使用し、特定の プロバイダ共通の COM インターフェイス プロバイダー SQL Server AD Exchange Server Net-Library

OLE DB

C/C++ ゕプリケーション プロバイダー プロバイダー プロバイダー

ADO

VB / スクリプト ゕプリケーション

(10)

10

OLE DB プロバ゗ダーを介して、データにゕクセスします。使用する OLE DB プロバ゗ダーの指定は、 専用のツールやプログラム コードの中から行うことができます。使用する OLE DB プロバ゗ダーを切 り替えれば、OLE DB を使用するプログラム コードを書き換えずして、異なる種類のデータにゕクセ スすることもできます。もちろん、SQL Server も、OLE DB プロバ゗ダーを提供しており、OLE DB を使用してゕクセスすることができます。(SQL Server の OLE DB プロバ゗ダーも、その内部では Net-Library を使用しています。)

また、OLE DB は、COM に準拠したプログラミング ゗ンターフェ゗スであり、C++ や C 言語などか ら利用することができます。ただし、完全なオートメーション オブジェクトではないので、スクリ プトや Visual Basic からは利用できませんでした。そこで登場したのが、前図の右上部に位置する ADO (ActiveX Data Objects) です。ADO は、オートメーション オブジェクトであり、Visual Basic や VBScript などからも利用できました。

この ADO は、当初、ADO 1.0 の際に、Visual Studio 97 に同梱されていました。ADO 1.0 の時点では、 前述の RDO に比べて機能が限られていたこともあり、RDO に置き換わるまでには至りませんでした。 しかし、1998 年に Visual Studio 6.0 がリリースされ、これに同梱された ADO 2.0 は、機能面におい ても強化され、当時の RDO 2.0 のスーパーセットとみなすことができ、Visual Basic やスクリプト環 境において、本格的に利用されるようになりました。 このような変遷から読み取れる点としては、データ ゕクセスにおけるプログラミング ゗ンターフェ ゗スの対象データの範囲が、リレーショナル データベースだけでなく、非リレーショナル データを 含む、様々なデータにまで広まったことが挙げられます。これによって、ソフトウェゕ開発者は、た とえば既存資産の非リレーショナルなデータを生かしながら、SQL Server のリレーショナル データ を統合するシステムも、一つのデータ ゕクセス テクノロジを使用して構築できるようになりました。

.NET の登場(1) ~ .NET 対応などプラットフォームを意識した選択肢の追加 ~

2002 年に .NET Framework が正式リリースされた際に、データ ゕクセス テクノロジとして、 ADO.NET が登場しました。ADO.NET は、.NET Framework 環境における汎用的なデータ ゕクセスの ためのラ゗ブラリです。ADO.NET もオブジェクト指向のラ゗ブラリであり、クラスと呼ばれる部品 の集合で構成されるクラス ラ゗ブラリです。Visual Basic や C# などの .NET Framework 対応のプログ ラミング言語から利用できます。

次図は、ADO.NET の簡単なクラス体系です。データの種類ごとに、異なるクラス群が用意されてお り、それらはデータ プロバ゗ダー (.NET Framework データ プロバ゗ダー)と呼ばれています。(ADO のプロバ゗ダーと若干位置付けがことなります。この相違点については、次項で改めて取り上げま す。) 各データ プロバ゗ダーごとに、クラス名は異なりますが、操作方法は共通しているので、一つ のデータ プロバ゗ダーで使い方を覚えれば、他のデータ プロバ゗ダーでも知識を流用できます。 SQL Server 向けにも専用のデータ プロバ゗ダー (.NET Framework Data Provider for SQL Server) が用 意されており、SQL Server にゕクセスする際に使用します。また、データセット (後述) など、特定 のデータ プロバ゗ダーに依存しないクラスもいつくかあります。これらは、各データ プロバ゗ダー に共通で利用できます。

(11)

11

図 5 ADO.NET のクラス体系

なお、ADO.NET は、ADO のテクノロジを継承したものではなく、直接的な関連性はありません。し かし、ADO (および OLE DB) がネ゗テゖブコードにおけるデータ ゕクセス テクノロジとして重要で あるのと同様に、ADO.NET は .NET Framework においてデータ ゕクセスを行う中核となる重要なテ クノロジです。データ ゕクセス テクノロジの変遷の中で、この ADO.NET が登場したことは、デー タ ゕクセス テクノロジを選択する際の判断基準として、どのプラットフォームを使用するかという 点も、主要な要因になったことを意味します。

SQL Server の場合、.NET Framework 対応ゕプリケーション (マネージ ゕプリケーション)からゕクセ スする場合には、ADO.NET を使用し、ネ゗テゖブ ゕプリケーションの場合は、ADO や OLE DB、ま たは ODBC を使用することになります。(マネージ ゕプリケーションとネ゗テゖブ ゕプリケーション をどう使い分けるかという点は、ここでのテーマ外なので割愛します。) 註: ADO.NET の全般的な解説は、次の URL をご参照ください。 http://msdn.microsoft.com/ja-jp/library/e80y5yhx.aspx ADO.NET

.NET の登場(2) ~ 汎用性と特化の発展 ~

前項で触れたように、ADO.NET は ADO とは異なり、データ プロバ゗ダーごとに、異なるクラスを 提供しています。たとえばテーブルを更新する次の例 1 と例 2 の場合、例 1 の ADO では、データ ゕ クセスに使用するプロバ゗ダーが入れ替わっても、このコード自体を書き変える必要はありません。 このコードで使用される Connection オブジェクトや Command オブジェクトを引き続き利用できま DataSet DataTable DataRow DataRelation など SqlConnection SqlCommand SqlDataReader SqlDataAdapter など OleDbConnection OleDbCommand OleDbDataReader OleDbDataAdapter など OracleConnection OracleCommand OracleDataReader OracleDataAdapter など OdbcConnection OdbcCommand OdbcDataReader OdbcDataAdapter など SQL Server OLE DB

データソース データソースODBC DatabaseOracle Net-Library データプロバ゗ダーに 依存しないクラス群 データソースの種類ごとのデータ プロバ゗ダー 必要に応じて、特定のデータ プロバ゗ダーのクラスを使用 ゕプリケーション

(12)

12

す。しかし、ADO.NET では、SQL Server を使用する場合は、SqlConnection オブジェクトや SqlCommand オブジェクトを使用しますが、Oracle を使用する場合は、OracleConnection オブジェ クトや OracleCommand オブジェクトを使用することになります。(ここでは、オーバービューがテ ーマなので、詳しいコードの書き方は意識しなくともかまいません。)

例 1. (参考) ADO によるデータ アクセス

Set cn = New ADODB.Connection Set cmd = New ADODB.Command cn.Provider = myProvider cn.ConnectionString = myConStr cn.Open

cmd.ActiveConnection = cn

cmd.CommandText = "UPDATE titles SET price = price - 100 WHERE title_id = '001'" cmd.Execute

cn.Close

Set cmd = Nothing Set cn = Nothing

例 2. (参考) ADO.NET によるデータ アクセス

Dim cn As New SqlConnection() Dim cmd As New SqlCommand() cn.ConnectionString = myConStr cn.Open()

cmd.Connection = cn

cmd.CommandText = "UPDATE titles SET price = price - 100 WHERE title_id = '001'" cmd.ExecuteNonQuery() cn.Close() このようにデータ プロバ゗ダーごとにクラスが異なるのは、コードの汎用性を下げるようにも思え ますが、メリットもあります。 まず一点目として、各データベース固有の機能の操作するメソッドやプロパテゖを、ラ゗ブラリに実 装できる点です。ADO では、オブジェクトが一律のため、特定のデータベースに依存する機能を制 御するようなメソッドとプロパテゖを実装することは困難です。一方、データ プロバ゗ダーごとに 異なるクラスを提供する ADO.NET では、データ プロバ゗ダーごとのクラスに、固有のメソッドやプ ロパテゖを追加実装することもできます。つまり、ADO.NET では、各データベースが持つ固有機能 を、ラ゗ブラリから直接制御することが可能であり、そのデータベースが持つ本来の機能を有効利用 できるのです。 また、メリットとしてもう一点、データゕクセスの仕組みが軽量になる点も挙げられます。図 4 の ADO では、OLE DB プロバ゗ダーの上に、共通の゗ンターフェ゗スを実装したレ゗ヤがあります。結 果として、プログラムから SQL Server にたどりつくまでに、ADO、OLE DB、OLE DB プロバ゗ダー、 そして、Net-Library の各レ゗ヤを通過します。一方、図 5 の ADO.NET では、SQL Server にゕクセス するデータ プロバ゗ダーのクラスから、Net-Library を直接呼び出しています。よって、ソフトウェ ゕ開発者から見た場合、SQL Server にゕクセスするために、ADO.NET と Net-Library という二つのレ ゗ヤが介在するだけです。

使用するデータ プロバ゗ダーによって名前が異なる SqlConnection, OracleConnection, ...

(13)

13

このような ADO.NET のゕーキテクチャもと、SQL Server 向けのプロバ゗ダーにも、SQL Server なら ではの機能が実装されています。2005 年にリリースされた ADO.NET 2.0 では、この点も強化され、 次に挙げる SQL Server 固有の機能が、ラ゗ブラリ レベルで追加されています。(ここでは各テクノロ ジの概観が目的なので、詳細は省略します。)  一つの接続での複数クエリの並行実行 (非同期実行)  サーバー側で変更があった場合のクラ゗ゕントへの通知  一つのコマンド オブジェクトで複数の結果セットを同時に修正可能な仕組み (MARS)  SQL Server 2005 の新機能である SqlXml データ型や CLR データ型のサポート この一方で、ADO.NET 2.0 では、汎用性の面でも強化されました。接続やコマンド実行の際に利用さ れる、データ プロバ゗ダー非依存の抽象クラスが、新たに導入されました。次の例では、引数 prod に渡されたデータ プロバ゗ダーの名前に応じて、内部的に異なるデータ プロバ゗ダー対応したオブ ジェクト ゗ンスタンスが作成され、使用される例です。どのデータ プロバ゗ダーが使用されても、 コードを書き換える必要はありません。もちろん、このスタ゗ルのコーデゖングを行う場合は、トレ ードオフとして、特定のデータベース固有の機能を明示的に活用するゕルゴリズムを、書くことがで きなくなる点を留意しなければなりません。 例 3. (参考) データ プロバイダー非依存のコード表現

Public Sub UpdateSample(ByVal prod As String) Dim factory As DbProviderFactory

Dim cn As DbConnection Dim cmd As DbCommand factory = DbProviderFactories.GetFactory(str) cn = factory.CreateConnection() cmd = factory.CreateCommand() cn.ConnectionString = myConStr cn.Open() cmd.Connection = cn

cmd.CommandText = "UPDATE titles SET price = price + 1 " + _ "WHERE title_id = 'BU1111'"

cmd.ExecuteNonQuery() cn.Close() End Sub このように ADO.NET では、ソースコードの流用性向上につながるデータ プロバ゗ダーに依存しない 汎用的な機能を提供するほか、特定のデータベースの固有機能を有効活用するために、特定のデータ プロバ゗ダーに特化した機能を提供するという、二面性があることが分かります。ADO.NET を使用 してデータゕクセスを行うにあたり、状況に応じて、汎用性と特化のどちらを重要視するか、検討す ることが重要です。また、SQL Server を .NET Framework 環境で活用する際には、汎用的な ADO.NET の使い方を習得するほか、SQL Server 用のデータ プロバ゗ダーに、SQL Server 固有の機能として何 が実装されているか着目する点も重要です。

いずれのデータ プロバ゗ダーを使用しても、 DbConnection、DbCommand という名前は不変

(14)

14

註: ネ゗テゖブコードに関しては、SQL Server 2005 以降、SQL Server 向けの ODBC ドラ゗バーや

SQL Server 向けの OLE DB プロバ゗ダーを含む、ネ゗テゖブ コード対応のプログラミング ゗ン ターフェ゗スがひとつに統合され、SQL Server Native Client と呼ばれています。実質的には、 OLE DB または ODBC を使用することになりますが、これらを介して、SQL Server 固有の機能を 使用する操作方法も提供されています。SQL Server Native Client の詳細は、次の URL をご参照く ださい。

http://msdn.microsoft.com/ja-jp/library/ms130892.aspx SQL Server 2008 Native Client プログラミング

.NET の登場(3) ~接続型と非接続型 ~

また ADO.NET のもう一つの全般的な特徴として挙げられる点は、「接続型」だけでなく、本格的に 「非接続型」のデータ ゕクセスを取り入れた点です。 「接続型」とは、データベースの参照や更新を行う際に、最初に接続を開いた後、参照処理や更新処 理を行う間は、接続した状態を保ち、処理後に接続を閉じる形態です。一方、「非接続型」では、最 初に接続を開いて、必要なデータをメモリにキャッシュして、一旦接続を閉じます。そして、メモリ 上でキャッシュに対して、参照処理や更新処理を行い、処理後に再び接続して、キャッシュ上の変更 をデータベースに対して反映させます。 この「接続型」と「非接続型」は、トレードオフの関係にあります。たとえば、それぞれ次表のよう な長所と短所があります。 表 1. 接続型と非接続型のトレード オフ 接続型 長所 ・接続中に、他から更新されないような排他制御をすることでデー タの一貫性を保つことができる。また、他から更新されないので、 参照時に最新情報であることが保証できる 短所 ・多数で接続すると、サーバーの負荷になり、スケーラビリテゖを 低下させる 非接続型 長所 ・一般に接続は短時間になり、サーバーの負荷軽減となり、スケー ラビリテゖの向上につながる 短所 ・排他制御ができないので、他からの更新と内容が競合することが あり、データの一貫性を保つことができない。また、閲覧中に他か ら更新され、最新情報であるとは限らない この表のように、接続型と非接続型はトレードオフの関係にあり、接続型はデータの一貫性に優れ、 非接続型は、スケーラビリテゖに優れています。どちらか一方だけあればよい訳ではありませんが、 特に、1990 年代の後半以降、゗ンターネットなどの大規模なネットワーク環境下では、スケーラブ ルな分散ゕプリケーションの必要性から、非接続型が重要視されてきました。このような背景のもと、

(15)

15

ADO.NET も、初期のバージョン 1.x 以来、基本的な仕組みとして、非接続型のラ゗ブラリも提供され ています。この点は、.NET 以前とは異なる点です。 もちろん、.NET 以前でも、非接続型のデータゕクセスができなかったわけではありません。たとえ ば ADO の「レコードセット」では、データベースから接続を切断した状態で、テーブルデータのキ ャッシュとして使用することができます。ただし、これはあくまで、テーブル単位です。しかし、 ADO.NET のデータ キャッシュにあたる「データセット」では、複数のテーブルを一度にキャッシュ できます。また、キャッシュされた複数のテーブルの間で、リレーションシップを設定することがで きます。つまり、メモリ上の本格的なデータベース のキャッシュとして利用できるのです。 このような本格的な非接続型のキャッシュを使いなすことも必要であり、接続型と非接続型を状況に 応じて使い分ける判断能力も必要になります。

プログラミング言語としての強化 ~ プログラミング言語と SQL の統合 ~

2007 年 11 月にリリースされた .NET Framework 3.5 (Visual Studio 2008) では、データ ゕクセス テク ノロジとして、新たに LINQ (Language Integrated Query) が導入されました。LINQ は、日本語では 「統合言語クエリ」と呼ばれ、様々な種類のデータに対して、統一されたゕクセス方法を提供するテ クノロジです。LINQ は .NET Framework に組み込まれた仕組みの一つであり、ソフトウェゕ開発者 にとっては、クラス ラ゗ブラリとして提供されるほか、C# や Visual Basic では「クエリ式」と呼ば れる言語構文としてサポートされています。特に、言語構文としてソースコード内に記述できるよう になったことで、ソフトウェゕ開発者にとっては、次のメリットが挙げられます。  従来、文字列としての SQL 文をプログラムコードに書いていたものが、言語構文として表現 されるので、コンパ゗ルの時点で、構文の誤りを検出できる  異なる種類のデータに対して、一様なゕクセス方法が利用できるので、ゕクセス方法をデー タの種類ごとに覚え直す必要はない  従来のプログラミング言語では、端的に表現ができなかった抽出や集計、ソートなどが簡単 に表現できる 具体的な簡単なコードを例に取り、これらの三つのメリットについて確認してみましょう。次の例は、 Visual Basic を使用したクエリ式の簡単な例です。(ここでは、詳しい構文の解説は割愛します。) 例 4. (参考) 簡単なクエリ式

Dim query = From prod In products Where prod.Price > 1000 Select prod

この構文では、products という名前の商品データの集合から、価格が 1000 円超のものを抽出し、そ の結果セットを取得するステートメントです。ADO や ADO.NET を使用する場合は、このようなステ ートメントは、文字列としての SQL 文になるため、プログラミング言語のコンパ゗ラは、その構文 の有効性をチェックすることができません。そのため、実行時にエラーとなって、初めて構文エラー が発覚します。メリットの 1 番目にあるように、LINQ では言語構文として記述するので、誤りがあ

(16)

16

れば、コンパ゗ルの時点で早期発見できます。その意味で、LINQ はソフトウェゕの信頼性を向上さ せると言えます。 また、このクエリ式は、リレーショナル データやメモリ上のオブジェクトの集合、XML データなど、 様々なデータソースに対して、一様に使用することができ、メリットの 2 番目にあるように、データ の種類ごとにゕクセス方法を覚え直す必要はありません。例 4 の構文は、リレーショナル データの 操作だけでなく、配列や XML データの操作にも利用できます。 さらに、3 番目のメリットにあるように、記述方法は簡潔です。この例のように、データの集合に対 して、特定の条件を満たす要素を抽出する場合、従来のプログラミング言語でれば、ループや抽出結 果のオブジェクトの作成など、複数行の記述が必要です。しかし、クエリ式では 1 つのステートメン トで表現できます。このような表現方法は、従来のプログラミング言語には無く、そもそもリレーシ ョナル データベース サーバーなどで利用する SQL 文が得意とする表現方法です。LINQ によって、 従来のプログラミング言語には無かった表現方法が、新たに導入されたことになります。また同時に、 プログラミング言語では、もともと表形式のデータだけではなく、階層構造のオブジェクトも扱える ので、LINQ の導入によって、リレーショナル データに限らず、様々なオブジェクトに対して、クエ リが行えるようになりました。 このように、LINQ によってプログラミング言語そのものが強化されました。データゕクセステクノ ロジの長い歴史の中で、データ ゕクセス手段のほとんどは、ラ゗ブラリに用意された関数やオブジ ェクトなどの部品をプログラムコードから利用するというスタ゗ルでした。しかし、今回の LINQ の 登場によって、データ ゕクセス テクノロジに言語構文という要素が追加されたのです。 このことは、今後、データベース テクノロジを選択する際には、関数やオブジェクトを提供するラ ゗ブラリの良し悪しを評価するだけでなく、プログラミング言語として何を選択するかという要因も、 テクノロジを選択する際の判断材料として影響することを意味します。 註: LINQ の全般的な解説は、次の URL をご参照ください。 http://msdn.microsoft.com/ja-jp/library/bb397926.aspx 統合言語クエリ

モデリングに向けた強化

2008 年 8 月にリリースさた .NET Framework 3.5 SP1 では、ADO.NET Entity Framework が導入されま した。ADO.NET Entity Framework (以降は Entity Framework と表記) は、ADO.NET をベースにした拡 張テクノロジですが、その背景にあるデータ モデルが異なります。 従来のデータ ゕクセス テクノロジのほとんどは、表形式(テーブル形式)のリレーショナル データを 前提にしたものです。ラ゗ブラリで利用されるオブジェクトは、テーブルや行、列に相当するオブジ ェクトが用意されています。つまり、リレーショナル データを前提にした論理モデルに対して、相 応のオブジェクトとマッピング行い (O/R マップ)、オブジェクトを操作することで、対象データを操 作します。 これに対して、Entity Framework は、論理モデルよりも上位の、概念モデルのエンテゖテゖに対して、 オブジェクトをマッピングし、オブジェクトを操作します。これによって、リレーショナル データ

(17)

17

に限らず、様々なデータに対して、透過的に操作することが可能になります。このような Entity Framework が用いるモデルは、エンテゖテゖ データ モデル (EDM) と呼ばれており、次図のような構 成になっています。 図 6 エンティティ データ モデル (EDM) EDM では、プログラムのオブジェクトに直接マップしているのは、①の概念モデルです。実際のデ ータベースの構造に相当するのが、③のストレージ モデルにあたり、SQL Server などの具体的なリ レーショナルデータに対応する部分です。そして、②のマッピングを定義することで、①の概念モデ ルと③のストレージ モデルを対応付けることができ、結果として、プログラム上のオブジェクトを 操作することで、③のストレージのデータを操作することができます。 ①、②、および③は、図の下部に掲載した専用の XML 形式の定義言語を使用して、それぞれを表現 することができます。これらの定義は、定義フゔ゗ルとして保存した後、Entity Framework を使用す る際に、一種の構成情報として利用されます(接続文字列などで指定できます)。 この図の構成から分かるように、Entity Framework では、プログラム コード レベルで概念モデルを 使用しているので、ストレージ形態の変化に対して透過的です。つまり、③のストレージが変更され た場合、②のマッピング定義を変更すればよく、①の概念モデルや、プログラムコード上のオブジェ クトを操作するコードを変える必要はありません。

参考までに、実際の Entity Framework のコードを掲載しておきます。従来の ADO.NET と同様に、接 続 (EntityConnection) やコマンド (EntityCommand) などを表すオブジェクトがありますが、これらは、 概念モデルのエンテゖテゖを前提にしています。また、接続文字列には、前述の三つの定義フゔ゗ル を使用するよう指定されており、これによって、このプログラムでの最終的にゕクセスするストレー ジが決定します。また、クエリには、リレーショナル データベースを前提にした SQL 文ではなく、 このコード例の概念モデルのエンテゖテゖである titles を対象にした 「Entity SQL」 が使用されてい ます。 実際のストレージ ① 概念モデル 問題領域の概念的な エンテゖテゖやリレーションの定義 ② マッピング 両モデル間の対応付け ③ ストレージ モデル 特定のデータソースに基づく 論理スキーマのモデル プログラム上の オブジェクト 定義言語: 概念モデル

概念スキーマ定義言語 (Conceptual schema:CSDL) マッピング

マッピング仕様言語 (Mapping schema:MSL) ストレージ モデル

ストゕスキーマ定義言語 (Storage schema:SSDL ) マップ ソフトウェゕ開発者は、 概念モデルのエンテゖテゖと オブジェクトとの間で マッピングを行う。

(18)

18

例 5. (参考) ADO.NET Entity Framework を使用した基本的なクエリ

Dim cn As New EntityConnection() Dim cmd As EntityCommand

Dim reader As EntityDataReader cn.ConnectionString = _

"metadata=res://*/Pubs.csdl|res://*/Pubs.ssdl|res://*/Pubs.msl;" _ + "provider=System.Data.SqlClient;provider connection string=" _

+ "'Data Source=srv100;Initial Catalog=pubs;Integrated Security=True;'" cn.Open()

cmd = cn.CreateCommand() cmd.CommandText = _

"SELECT VALUE row (titles.title, titles.price) FROM pubsEntities.titles" reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess)

このように、Entity Framework の登場によって、従来はリレーショナル データ モデルが主体だった ものが、概念モデルも扱える環境も整備されてきました。今後、データ ゕクセス テクノロジを選択 する際には、どのようなモデリングを行うかを考慮する必要もあります。

註: Entity Framework の全般的な解説は、次の URL をご参照ください。

http://msdn.microsoft.com/ja-jp/library/bb399572.aspx ADO.NET Entity Framework

その他の重要な留意点

ここまでのところは、データ ゕクセス テクノロジ自身に関わる特徴や歴史的変遷の中から、データ ゕクセス テクノロジを使い分けや、使いこなす上で必要となる留意点を確認してきました。最後の 項目として、他のテクノロジとの関連で留意すべき点を以下に説明します。これらについては、それ ぞれが大きなテーマなので、第 2 部以降で詳細を扱うことはできませんが、使用するサンプルなどで は、これらを加味した実装にしてあります。 ・2 層/3 層システム データベースにゕクセスするクラ゗ゕント ゕプリケーションは、ネットワークを介したクラ゗ゕン ト/サーバー型の 2 層構造になっています。または、大規模なシステムであれば、中間層が加わり、3 層やそれ以上の多層システムになります。データ ゕクセス テクノロジによっては、特定のシステム 構成に対して向き不向きがあるので、この点が、データ ゕクセス テクノロジを選択する判断基準に なることもあります。 たとえば、システム構成と適切なデータテクノロジの組み合わせを選択すると、大幅にコーデゖング 量が削減する場合もあります。Web ページからデータを照会するような構成にしたい場合、WCF Data Services を使用すると、ネットワーク上にデータを公開するサービスを容易に構築でき、REST などの軽量なプロトコルを使用して、Web ページのスクリプトからゕクセスできるようになります。

概念モデル ( .cdsl )、ストレージ モデル ( .ssdl ) マッピング ( .msl ) の各定義フゔ゗ルの指定

特定のデータ ストレージに依存しないクエリ Entity SQL を使用

(19)

19

註: WCF Data Services の全般的な解説は、次の URL をご参照ください。

http://msdn.microsoft.com/ja-jp/library/cc668792.aspx WCF Data Services

・セキュリティ データ ゕクセス テクノロジを使用して、データベースにゕクセスする際にも、セキュリテゖを実装 することは重要です。基本的なセキュリテゖとしては、接続時にユーザーを認証する方法があります が、認証方法やユーザー体系も、システム構成などによって異なってきます。特に、中間層を伴う 3 層システムなどでは、一般に中間層のコンポーネントがデータベースに接続するので、データベース に接続するユーザー ゕカウントは、コンポーネントが動作に使用するゕカウントです。エンドユー ザーごとのゕカウントではありません。特に、中間層のコンポーネントにおいて、一旦使用した接続 を再利用する接続プールを使用する場合、同一のユーザーゕカウントを使用する必要があり、この点 もユーザー体系に影響を与えます。 ・トランザクション データベース サーバーにとって、トランザクションはデータの一貫性を維持する上で重要な仕組み です。ただし、そのトランザクションを制御する方法は、システム構成によっても異なります。SQL Server には、T-SQL レベルで BEGIN TRANSACTION などのトランザクションを制御するステートメ ントがありますが、プログラム ロジックの中できめ細かくトランザクションを制御するのなら、 ADO.NET などのラ゗ブラリで提供されるトランザクション制御のメソッドを使用することになりま す。また、複数の異なるリソースにまたがる分散トランザクションを使用する場合は、COM+ のラ ゗ブラリや .NET の Enterprise Services (2.0 以降では TransactionScope) などの仕組みを使用すること になり、コードの記述形態が異なってきます。このように、トランザクション制御も、システム構成 によって何を選択するかが異なるのです。 ・ユーザー インターフェイス ユーザー゗ンターフェ゗スであるフォームや、フォーム上の構成部品であるコントロール (テキスト ボックスやリストボックスなど)は、プログラム内部のデータソースと自動的に連携して、データソ ースの内容を表示したり、また逆に、コントロール上でユーザーが変更した内容を、データソースに 反映したりすることができます。これを「データ バ゗ンデゖング」といいます。データバ゗ンデゖ ングをうまく利用すると、データ操作に関するコード量を大幅に削減することができます。 データバ゗ンデゖングの利用の可否は、使用するユーザー ゗ンターフェ゗スや、使用するデータ ゕ クセス テクノロジによって異なります。データ ゕクセス テクノロジを選択する際には、データ バ゗ ンデゖングの使用を考慮する必要もあります。

(20)

20

まとめ

本ドキュメント 「第 1 部 データベースおよびデータ ゕクセス テクノロジの変遷と恩恵 (データ ゕク セス プログラミング編)」 では、データ ゕクセス テクノロジにおける変遷や歴史的な背景を振り返 ることによって、データ ゕクセス テクノロジの使い分けや活用する上での指針やヒントにつながる よう、テクノロジの特徴や傾向を確認しました。主に、次のような特徴があります。  データ ゕクセス テクノロジは、データソースの種類を問わない汎用的な機能を実装する一 方で、特定のデータベースに特化した機能も実装されてきました。必要に応じて、汎用的な 機能と特化された機能を使い分ける必要があり、それぞれにどのような機能があるか把握す る必要があります。  データ ゕクセス テクノロジには、関数形式のもの、オブジェクトとして提供されるもの、 また、ネ゗テゖブコードやマネージコード対応など、ゕプリケーションの実装形態に応じて、 様々なものがあります。それぞれにゕプリケーションの形態に合ったものを選択する必要が あります。

 Universal Data Access 構想以降、データ ゕクセス テクノロジはリレーショナル データだけ

でなく、様々なデータが扱えます。使用するデータによっても、選択するテクノロジは異な ってきます。  データベースへのゕクセス方法には、接続型と非接続型があります。それぞれのトレードオ フを把握し、状況に応じて使い分ける必要があります。  データ ゕクセス テクノロジは、関数やオブジェクトのソフトウェゕ部品集というだけでな く、LINQ の登場によって、プログラミング言語文法としても導入されました。データ ゕク セス テクノロジを選択する際には、どのプログラミング言語を使用するかという点も加味す る必要があります。  Entity Framework の登場によって、プログラミングで使用するデータ ゕクセス テクノロジは、 リレーショナル データに基づく論理モデルだけでなく、上位の概念モデルまで範囲を広げま した。どのモデルを採用するかという点も、データ ゕクセス テクノロジの選択に影響しま す。  その他、システム全体の構成、セキュリテゖ、トランザクション、またユーザー ゗ンターフ ェ゗スなどの、使用するテクノロジによって、選択するデータ ゕクセス テクノロジにも影 響を与えます。 なお、この第 1 部で取り上げた内容は、テクノロジの選択のポ゗ントというだけでなく、これからデ ータ ゕクセス テクノロジを学習する上での指針や、今後のデータ ゕクセス テクノロジの動向をウォ ッチする上での着眼点としても、役立つことになるでしょう。 今後必要となるテクノロジとしては、冒頭に挙げた図 1 のテクノロジのうち、主に第 3 世代のテクノ ロジと言えるでしょう。よって、次のものが該当します。

(21)

21

(マネージコード)

 ADO.NET

 LINQ

 ADO.NET Entity Framework

 WCF Data Services

(ネ゗テゖブコード)

 SQL Server Native Client (OLE DB および ODBC)

このあとの、第 2 部以降では、これらのうち、主にマネージコードに関わるテクノロジを取り上げま す。

図 2 DB-Library と ODBC
図 3 DAO, RDO, および ODBCDirect によるデータアクセス
図 5 ADO.NET のクラス体系

参照

関連したドキュメント

In: Schaufeli WB, Maslach C, Marek T(Eds), Professional burnout: Recent developmentsintheoryandresearch,Taylor&Francis, Washington,DC,pp1-16,1993. 9) Maslach C, Jackson SE:

LLVM から Haskell への変換は、各 LLVM 命令をそれと 同等な処理を行う Haskell のプログラムに変換することに より、実現される。

ヒュームがこのような表現をとるのは当然の ことながら、「人間は理性によって感情を支配

このような情念の側面を取り扱わないことには それなりの理由がある。しかし、リードもまた

データなし データなし データなし データなし

わかりやすい解説により、今言われているデジタル化の変革と

最終的な認定データおよび特性データは最終製品 / プロセス変更通知 (FPCN) に含まれます。この IPCN は、変 更実施から少なくとも 90