データセットの種類
データセットの理解:インデックス への移動
「TDataSet の下位オブジェクトの使い方」では,TDataSet の下位オブジェクトを,データにアクセスするために使用する方式によって分類しています。TDataSet の下位オブジェクトを分類するうえで役立つもう 1 つの方法は,それらが表すサーバーデータの種類を考慮に入れることです。この点からすると,データセットは基本的に 3 種類に分類できます。
テーブルタイプのデータセット:データベースサーバーの単一のテーブルを表し,その行と列全体を含みます。テーブルタイプのデータセットには,Bde.DBTables.TTable,ADOdb.TADOTable,SQLExpr.TSQLTable,IBX.IBTable.TIBTable があります。
テーブルタイプのデータセットでは,サーバー上で定義されたインデックスを利用できます。データベーステーブルとデータセットは 1 対 1 に対応しているので,データベーステーブル用に定義されたサーバーインデックスを使用することができます。インデックスを使用すれば,アプリケーションで,テーブルのレコードのソート,スピードサーチおよびルックアップを行うことが可能になります。また,マスター/詳細関係の基礎ともなります。いくつかのテーブルタイプのデータセットでは,データセットとデータベーステーブルの 1 対 1 関係を利用して,データベーステーブルの作成や削除のような,テーブルレベルの操作を可能にしています。
問い合わせタイプのデータセット:単一の SQL コマンド,つまり問い合わせを表します。問い合わせは,コマンド(典型的には SELECT 文)の実行の結果セットを表すことができます。また,レコードを返さないコマンドを実行することもできます(UPDATE 文など)。問い合わせタイプのデータセットには,Bde.DBTables.TQuery,ADOdb.TADOQuery,SQLExpr.TSQLQuery,IBX.IBQuery.TIBQuery があります。
問い合わせタイプのデータセットを効果的に使用するには,SQL とサーバーの SQL 実装の詳細(SQL-92 標準に対する機能拡張や制約など)をよく知っていなければなりません。SQL を扱うのが初めての方は,SQL を詳細に解説した市販の解説書を参照してください。「Understanding the New SQL: A Complete Guide」(Jim Melton,Alan R.Simpson 共著,Morgan Kaufmann Publishers)は好著の 1 つです。
ストアドプロシージャタイプのデータセット:データベースサーバー上のストアドプロシージャを表します。ストアドプロシージャタイプのデータセットにはBde.DBTables.TStoredProc,ADOdb.TADOStoredProc,SQLExpr.TSQLStoredProc,IBX.IBStoredProc.TIBStoredProc があります。
ストアドプロシージャは,使用されるデータベースシステム固有のプロシージャ/トリガ言語で書かれた自己包含型のプログラムです。通常は,頻繁に繰り返されるデータベース関連のタスクを行うもので,多数のレコード上での操作や,集計関数や算術関数を使用する操作で特に有効です。一般にストアドプロシージャを使用すると,次の点でデータベースアプリケーションの処理効率が改善されます。
- サーバーの大きな処理能力と速度を利用する
- 処理をサーバーに移動することにより,ネットワークトラフィックを減少させる
ストアドプロシージャには,データを返すものと返さないものがあります。データを返すストアドプロシージャにも,1 つのカーソルを返すもの(SELECT 問い合わせの結果に類似),複数のカーソルを返すもの(事実上複数のデータセットを返す),出力パラメータでデータを返すものがあります。これは,一部にはサーバーの違いによるものです。ストアドプロシージャでデータを返せないサーバーや,出力パラメータだけを使用できるサーバーがあります。ストアドプロシージャをまったくサポートしないサーバーもあります。実際に何が利用できるかは,サーバーのドキュメントを参照してください。
メモ: 通常は,問い合わせタイプのデータセットを使用して,ストアドプロシージャを実行することができます。ほとんどのサーバーが,ストアドプロシージャを扱う SQL の拡張を提供しているからです。ただし,そのために使用する構文はサーバーごとに異なります。ストアドプロシージャタイプのデータセットのかわりに問い合わせタイプのデータセットを使用する場合は,サーバーのドキュメントを参照して,構文を確認してください。
TDataSet には,この 3 つのカテゴリのいずれかにきちんと収まるデータセットのほかに,複数のカテゴリにまたがる下位オブジェクトもあります。
- ADOdb.TADODataSet と SQLExpr.TSQLDataSet には CommandType プロパティがあり,テーブル,問い合わせ,ストアドプロシージャのどれを表すかを指定することができます。TADODataSet は,テーブルタイプのデータセットのようにインデックスを指定できますが,プロパティとメソッドの名前は問い合わせタイプのデータセットに似ています。
- Datasnap.DBClient.TClientDataSet は,別のデータセットからのデータを表します。そのため,テーブル,問い合わせ,ストアドプロシージャのいずれをも表すことができます。TClientDataSet の動作は,テーブルタイプのデータセットに最も似ています。インデックスをサポートしているからです。しかし,問い合わせおよびストアドプロシージャの一部の機能も持っています。パラメータの管理と,結果セットを取得せずに実行する機能です。
- ほかのいくつかのクライアントデータセットには CommandType プロパティがあり,テーブル,問い合わせ,ストアドプロシージャのどれを表すかを指定することができます。プロパティとメソッド名は TClientDataSet のものに似ています。その中には,パラメータのサポート,インデックス,および結果セットを取得せずに実行する機能が含まれます。
- IBX.IBCustomDataSet.TIBDataSet は問い合わせとストアドプロシージャの両方を表すことができます。実際のところ,同時に複数の問い合わせとストアドプロシージャを表し,それぞれに対して別個のプロパティを持つことができます。