Bde.DBTables.TQuery.DataSource

提供: RAD Studio API Documentation
移動先: 案内検索

Delphi

property DataSource: TDataSource read GetDataSource write SetDataSource;

C++

__property Data::Db::TDataSource* DataSource = {read=GetDataSource, write=SetDataSource};

プロパティ

種類 可視性 ソース ユニット
property published
Bde.DBTables.pas
Bde.DBTables.hpp
Bde.DBTables TQuery

説明

データソースコンポーネントを指定します。このコンポーネントから項目値を取り出して,SQL 文内の同名のパラメータで使用します。

DataSource プロパティを設定すると,別のデータセットの項目値を問い合わせのパラメータに自動入力できます。それと対応するデータセットの項目と同じ名前を持つパラメータに,その項目値が入力されます。対応するデータセットの項目と違う名前を持つパラメータは自動的に値を取得することはないので,プログラムによって設定しなければなりません。たとえば,TQuery の SQL プロパティが下記の SQL 文を保持し,DataSource を介して参照されるデータセットが CustNo 項目を持つ場合,CustNo パラメータでは対応するデータセットの現在のレコードの値が使用されます。

SELECT * FROM Orders O WHERE (O.CustNo = :CustNo)

DataSource は,対応するデータセットコンポーネントにリンクされた TDataSource コンポーネントを示すポインタでなければなりません。つまり,この問い合わせのデータソースコンポーネントを示すポインタにはなり得ません。

DataSource プロパティで指定されたデータセットを作成し,データを格納します。次いで,それを開いてから,パラメータをバインドします。パラメータのバインドは,問い合わせ実行の前に Prepare メソッドを呼び出すことで行われます。

ヒント:  DataSource は,リンクされた問い合わせを使ってテーブル間のマスター/詳細関係を作成する場合に特に役立ちます。また,Params プロパティまたは ParamByName メソッドでまだ設定されていないパラメータのバインドを確実にする場合にも役立ちます。

SQL 文にパラメータがない場合,またはすべてのパラメータが Params プロパティや ParamByName メソッドを使ってアプリケーションによってバインドされている場合,DataSource プロパティを割り当てる必要はありません。下記の例では,Query2 の DataSource プロパティを Query1 のデータソースに設定し,Query2 を準備してアクティブにしています。



with Query2 do begin
DataSource := DataSource1;
Prepare;
Open;
end;



Query2->DataSource = DataSource1;
Query2->Prepare();
Query2->Open();



TQuery の SQL 文が SELECT クエリーの場合,そのクエリーは別のデータセットのレコードポイントが変更されるたびに新しい項目値を使って実行されます。毎回,TQueryOpen メソッドを呼び出す必要はありません。これで,DataSource プロパティを使って問い合わせ結果セットを動的にフィルタ処理すると,マスター/詳細関係を確立する際に役立つようになります。Detail 問い合わせの DataSource プロパティをマスターデータセットの TDataSource コンポーネントに設定してください。

SQL 文が SELECT 以外(INSERT や UPDATE など)の問い合わせを使った場合,対応するデータセットの項目と同名のパラメータはそれでも値を取得しますが,そのデータセットのレコードポインタが移動するたびに問い合わせを明示的に実行しなければなりません。たとえば,下の SQL 文は,INSERT 文を使用し,CustNo と CompanyName というパラメータを持っています。

INSERT INTO Customer (CustNo, Company) VALUES (:CustNo, :CompanyName)

対応するデータセットである Query1 と DataSource1 は CustNo 項目を持ちますが,CompanyName 項目を持っていません。このデータセットを DataSource プロパティを介して使用する場合,CompanyName パラメータにプログラムで値を割り付けなければなりません。Query1 は CustNo 項目を持ち,Query1 は DataSource プロパティを介して参照されるので,CustNo パラメータは値を自動的に受け取ります。



with Query2 do begin
DataSource := DataSource1;
ParamByName('CompanyName').AsString := Edit1.Text;
Prepare;
ExecSQL;
end;



Query2->DataSource = DataSource1;
Query2->ParamByName("CompanyName")->AsString = Edit1->Text;
Query2->Prepare();
Query2->ExecSQL();



SQL 文に対応するデータセットの項目と同名のパラメータが入っている場合,そうしたパラメータの値を手動で設定しないでください。Params プロパティや ParamByName メソッドを使用するなどでプログラムによって設定された値があると,自動的な値でオーバーライドされます。ほかの名前のパラメータには,プログラムで値を指定しなければなりません。こうしたパラメータは,DataSource を設定しても影響を受けません。

DataSource は,実行時または設計時にオブジェクトインスペクタを使って設定できます。設計時には,ドロップダウンリストから希望する TDataSource を選択するか,名前を入力します。

関連項目