データ アクセスに関する推奨事項
更新 : 2007 年 11 月
ADO.NET では、接続を開き、データを取得するか操作を実行し、最後に接続を閉じるという流れのデータ アクセス モデルを前提としています。ADO.NET には、このモデルで操作を行う基本的な方法が 2 つあります。1 つの方法では、データがデータセット (データ ソースに接続していない状態で操作できる、レコードのメモリ内キャッシュ) に格納されます。データセットを使用するには、データセットのインスタンスを作成し、データアダプタを使用して、データ ソースからデータを読み込みます。その後、データセットのメンバにコントロールをバインドするなどして、データセット内のデータを操作します。詳細については、「Visual Studio のデータセットの概要」を参照してください。
もう 1 つの方法は、データベースに対して直接操作を実行する方法です。この方法では、TableAdapter クエリまたは SQL ステートメントを含むデータ コマンドを使用するか、またはストアド プロシージャへの参照を使用します。その後で、クエリまたはコマンドを実行して操作を行います。詳細については、「アプリケーションへのデータのフェッチ」を参照してください。
データセットへのデータの格納
Visual Studio アプリケーションにおける一般的なデータ アクセス モデルは、データをデータセットに格納し、TableAdapter またはデータ アダプタを使用してデータベースのデータを読み書きすることです。データセット モデルには次の利点があります。
複数のテーブルの使用 1 つのデータセットに複数の結果テーブルを個別のオブジェクトとして保持できます。これらのテーブルは、個別に操作するか、または親子テーブルとして操作できます。
複数のソースからのデータの操作 データセット内のテーブルは、多くの異なるソースからのデータを表すことができます。たとえば、異なるデータベースのデータや、XML ファイル、スプレッドシートなどのデータをすべての同じデータセットに保持できます。データセットにデータが格納されると、それがすべて 1 つのソースから取り込まれたかのように、同一の形式で操作したり関連付けたりできます。
分散アプリケーションの層間でのデータの移動 データセットにデータを保持することにより、アプリケーションのプレゼンテーション層、ビジネス層、およびデータ層の間でデータを簡単に移動できます。
他のアプリケーションとのデータ交換 データセットは、アプリケーションの他のコンポーネント、および他のアプリケーションとの間でデータを交換する方法を提供します。データセットでは、XML としてデータをシリアル化する機能や、XML スキーマを読み書きする機能など、広範な機能がサポートされています。
データ バインディング フォームを使用している場合は、コマンドの実行後にプログラムでコントロールにデータ値を読み込むよりも、データセット内のデータにコントロールをバインドした方が簡単です。
再利用するレコードの維持 データセットにより、データベースに再度クエリを発行せずに、同じレコードを繰り返し使用できます。データセットの機能を使用することにより、レコードのフィルタ処理と並べ替えを実行できます。また、ページングしている場合は、そのデータセットをデータのソースとして利用できます。
簡単なプログラミング データセットを使用すると、その構造をオブジェクトとして表すクラス ファイルを生成できます。たとえば、データセットの Customers テーブルに dataset.Customers オブジェクトとしてアクセスできます。これにより、プログラミングが簡単で明確になり、エラーが生じにくくなります。この方法は、IntelliSense やデータアダプタ構成ウィザードなどの Visual Studio ツールでサポートされています。
データベースの直接操作
データベースと直接やり取りすることもできます。この方法では、SQL ステートメントを含むデータ コマンド オブジェクトを使用するか、またはストアド プロシージャへの参照を使用します。その後で、コマンドを実行して操作を行います。詳細については、「コマンドとパラメータ (ADO.NET)」を参照してください。
セキュリティに関するメモ : |
---|
CommandType プロパティを Text に設定したデータ コマンドを使用するときは、クライアントから送信された情報をデータベースに渡す前に、その情報を十分にチェックしてください。悪意のあるユーザーが、承認なしでデータベースにアクセスしたり、データベースを破壊したりする目的で、変更した SQL ステートメントや追加の SQL ステートメントの送信 (挿入) を試みる場合があります。ユーザーの入力をデータベースに転送する前に、その情報が有効であることを常に検証する必要があります。できる限り、常にパラメータ化されたクエリまたはストアド プロシージャを使用することをお勧めします。 |
データベースを直接操作すると、次のような利点があります。
追加の機能 前に述べたように、DDL コマンドなどの一部の操作は、データ コマンドでしか実行できません。
柔軟な実行制御 コマンドを使用し、データ リーダーでデータを読み取ることにより、SQL ステートメントやストアド プロシージャをいつどのように実行し、その結果や戻り値をどのように処理するかについて、より直接的に制御できます。
オーバーヘッドの低減 データベースへ直接読み書きすることにより、データをデータ セットに格納する手順を省くことができます。データ セットはメモリを必要とするため、データ コマンドを使用するとアプリケーションのオーバーヘッドを低減できます。これは、Web ページに検索結果を表示する場合など、データを 1 回しか使用しない場合に特に有効です。そのような場合、データを表示するためにデータセットを作成してデータを読み込む手順は不要です。
一部の状況におけるプログラミング量の低減 場合によって、特に Web アプリケーションにおいては、データセットの状態を保存するために追加のプログラミングが必要になります。たとえば、Web フォーム ページでは、各ラウンド トリップごとにページが再作成されます。データセットを保存して復元するプログラムを追加しないと、データセットも各ラウンド トリップごとに廃棄されて再作成されます。データ リーダーを使用してデータベースからデータを直接読み取る場合は、データセットの管理に必要な手順を省くことができます。
データ アクセスに関する推奨事項
以下の各セクションでは、特定の種類のアプリケーションで使用するデータ アクセス方法の推奨事項を説明します。
Windows フォーム
通常、Windows フォームではデータセットを使用します。Windows フォームは、通常、ユーザー操作ごとにフォームがそのデータと共に作成されたり破棄されたりしないクライアント上で使用します。また、Windows フォーム アプリケーションでは、レコードを 1 件ずつフォームに表示するなど、レコードのキャッシュを保持することで利点を引き出すデータ アクセス方法も提供してきました。詳細については、「クライアント データ アプリケーションの作成」を参照してください。
データセットを使用する状況を次に示します。
同じレコードを繰り返し使用する場合。ユーザーが複数のレコード間を往復できるようにする場合などが挙げられます。
Windows フォームのデータ バインディング アーキテクチャを使用している場合。このアーキテクチャは、データセットの使用向けにデザインされています。
Web フォームについて列挙した前述の理由のいずれかが当てはまる場合。
TableAdapter クエリまたはデータ コマンドを使用する状況を次に示します。
データベースからスカラ値を取得する場合。
DDL コマンドなどの非クエリ操作を実行する場合。
フォームに表示する読み取り専用データを取得する場合 (レポートの作成など)。処理済のデータを再利用できるように保持しておく必要がない場合は、データ コマンドを使用します。
Web フォーム
通常はデータ コマンドを使用します。データのフェッチにはデータ リーダーを使用します。Web フォーム ページおよび Web フォーム ページに含まれるコントロールやコンポーネントは、ページのラウンド トリップごとに再作成されます。したがって、次のラウンド トリップまでキャッシュをしない場合、毎回データセットを作成してデータを読み込むことは非効率になる場合がしばしばあります。
データセットを使用した方が良い状況を次に示します。
複数の個別のテーブルまたは異なるデータ ソースのテーブルを使用する場合。
ほかのアプリケーションまたは XML Web サービスなどのコンポーネントとデータを交換している場合。
データベースから取得した各レコードに対して大規模な処理を実行する必要がある場合。データ コマンドおよびデータ リーダーを使用する場合は、レコードの読み込みのたびに処理が発生するため、接続を長い間維持しておくことになります。これがアプリケーションのパフォーマンスとスケーラビリティに影響を与える場合があります。
相互に依存するレコードがデータ処理に含まれる場合。たとえば、関連し合うレコードのルックアップなどがあります。
データに対して XSLT 変換などの XML 操作を実行する場合。
データセットを使用することで得られるプログラミングの簡便性を重視する場合。
XML Web サービス
XML Web サービスは、ASP.NET の Web アプリケーションです。したがって、Web フォーム ページと同じモデルを使用し、XML Web サービスは呼び出しが発生するたびに生成および破棄されます。このため、XML Web サービスのデータ アクセス モデルについては、Web フォームのデータ アクセス モデルとほぼ同じことが言えます。ただし、XML Web サービスは中間層オブジェクトの場合がよくあり、その場合は Web を介してほかのアプリケーションとデータを交換することが主要な目的になります。
データセットは次の場合に使用します。
XML Web サービスがデータの送受信を行う場合。データをメソッドの戻り値として送信したり、データをメソッドの引数として受信したりする場合などがあります。これは、XML Web サービスにおける基本的な用途です。別の理由でデータ コマンドの使用を検討することもありますが、ほかのコンポーネントとのデータ交換にはデータセットを使用することをお勧めします。
Web フォームについて列挙した前述の理由のいずれかが当てはまる場合。
次の状況では、データ コマンド (および必要に応じてデータ リーダー) を使用します。
XML Web サービスがスカラ値を取得する場合。
XML Web サービスが、DDL コマンドなどの非クエリ操作を実行する場合。
XML Web サービスがストアド プロシージャを呼び出して、データベース内でロジックを実行する場合。