TOracleDataSet component

プロパティ                メソッド                イベント

Top  Previous  Next

Unit

OracleData

説明

もしdata-awareコンポーネント(DBEdit, DBGridなど)を使用したい場合、TOracleDataSetコンポーネントを使ってください。ToracleDataSetは標準TdataSetコンポーネントから派生しています。標準TdataSetからほとんどのプロパティ、メソッド、そしてイベントを受け継いでいます。これに加えて、TOracleQuery コンポーネントから派生したプロパティとメソッドもあります。

ToracleDataSetを使うため、データベースに接続するためにSessionプロパティを設定して下さい。SQLプロパティ内のデータベースに対してselect命令を入力してください。Select命令内の全ての入力変数は、Variablesプロパティ内で宣言されなくてはなりません。そして実行時にはSetVariable メソッドを通して値を割り当てられなくてはなりません。もしSessionがログオン中なら、datasetを開くためにActiveTrueを設定できます。個々のフィールドプロパティを設定するためにdatasetのフィールドエディタを呼び出します (datasetアイコンの上で右クリック) 。標準datasourcedatasetにリンクしたら、data-awareコンポーネントを使えるようになります。

Datasetを更新可能にします

レコードを更新可能にするには、datasetは取得された全てのレコードのrowidを知っている必要があります。 Rowiddataset内のレコードを独自に特定する内部Oracle構造体です。クエリーに含まない限りは、datasetCanModifyプロパティはFalseのままになります。更新可能なdept datasetを作るために、SQL プロパティは: select dept.*, dept.rowid from dept

更に、更新可能なdatasetselect命令内の更新可能なテーブルのためにカラムエイリアスを使うべきではありません。これらエイリアス名は更新テーブルに続く挿入か更新のために使われるでしょう。その結果エラーが発生します。

もしある理由でクエリー内にrowidを提供することが不可能ならば、datasetを更新可能にするためにOnApplyRecord イベントを使うことが出来ます。

Dataset内の派生したフィールドを選択します

時に、一つのテーブルのカラムではないdatasetのフィールドを選択する必要があります。Select命令内で計算を行うことができ、格納された関数を呼び出し、他のテーブルからカラムを接続することが出来ます。

Dataset内に派生フィールドを作成するためにいくつかのルールが適用されます:

w        格納された関数の結果か計算であるカラムのためにエイリアスを使うべきです。そうでないければフィールド名は予測不能です。
w        もしdatasetが更新可能なら、接続されたテーブルはselect命令内の更新テーブルの後ろに置かれなくてはなりません。From節の最初のテーブルは更新テーブルと仮定されます。Join命令内のどのテーブルが更新されるかを示すために、UpdatingTable プロパティを使うことが出来ます。
w        datasetがもし更新可能ならば、派生フィールドのFieldKindプロパティはfkInternalCalcでなければいけません。 これはdatasetに対して、InsertUpdate命令に決して含まれないことを示します。
w        派生フィールドのReadOnlyプロパティは通常Trueに設定されていなければなりません。

次のサンプルはempテーブルに対して2つの派生フィールドを選択します:

select emp.*, emp.rowid, dept.dname, emp_max_sal(empno) max_sal

from emp, dept

where dept.deptno = emp.deptno

 

department name (dname)deptテーブルを通じて接続され、内蔵関数emp_max_salが呼び出されます。Deptテーブルは更新テーブルempの後ろにおかれ、カラムエイリアスmax_salは内蔵関数の結果を与えられます。

入力の正当性の確認

Dataset内でユーザーの入力の正当性を確認(validata)する方法はいくつかあります。例えば、フィールドのRangeプロパティやOnValidateイベント、そしてdatasetBeforePostイベントなどです。

しかしながら、Oracleの強みのひとつにデータベース内のデータインテグリティ(整合性)を保障する能力があります。宣言型の整合性チェックに、primary keyunique keyforeign keyそしてcheck constraintsを使うことが出来ます。もし手続き型ロジックが必要なら、データベーストリガーが使えます。このようにどれだけデータが更新されてもデータは守られます。

Delphiアプリケーションでユーザーからの入力の整合性を確かめる最も簡単な方法は、データベース内のintegrity constraintsに頼ることです。なぜそれらをアプリケーション内で重複して指定するのでしょう? EnforceConstraintsプロパティ、MessageTableプロパティとOnTranslateMessageイベントはOracleデータベースのintegrity constraintsの性能を十分に引き出すことを可能にします。

Oracle Dictionaryを使用する

Oracle Dictionaryは他のものと共にテーブル、カラムと制限に関する情報を含みます。前の整合性に関するセクションは、ToracleDataSetがどのようにこの情報を自動的に拾い上げるアプリケーションを提供するためにこの情報を使うかというサンプルです。OracleDictionaryプロパティは、Oracle Dictionary内のどの情報がTOracleDataSet によって使われるべきかを指定することが出来ます。

レコードのロック

Oracleサーバーはデータベース内の個々のレコードをロックすることが出来ます。LockingModeプロパティを設定することによってこれを使うことが出来ます。ユーザーがレコードを編集しようとするとき、レコードがデータベースに更新されるされる時、レコードがロックされるかどうかを制御することが出来ます。

locking modeに関わらず、データセットは常にレコードがデータベース内のものと一致するかをチェックします。これにより、ユーザーがレコードの古いイメージを変更してしまうのを防ぎます。

レコードのリフレッシュ

データベース内のレコードは稀にデータセット内のレコードと異なることがあります。他のユーザーがレコードを変更するかもしれないし、もしかするとデータベースに更新されるレコードを修正するサーバーサイドロジックがあるかもしれません。ユーザーが常にデータベースレコードの実際イメージで作業できるようにするために、アプリケーションに対して適切な値にRefreshOptions プロパティを設定することが出来ます。

キャッシュした更新

デフォルトではToracleDataSetはそれぞれの投稿されたレコードをデータベースに適用し、コミットします。CachedUpdatesを使用することが出来る時、時にこれは受け付けられません。 レコードはまずローカルのチェンジログに投稿され、後にTOracleSession.ApplyUpdatesを呼ぶことでデータベースに対して適用されます。

カーソル変数

カーソル変数に基づくデータセットを作るために、カーソルをオープンするプロシージャーを呼ぶためにSQLプロパティ内にPL/SQLブロックを作ります。カーソル変数に関する詳しい情報は、この機能を説明しているexampleをご覧ください。

複合クエリー結果を更新する

時に、クエリーが複雑すぎてシンプルテーブルを通して更新することが出来ないかもしれません。ToracleDataSetOnApplyRecord イベントをもち、これでlock, insert, update, deleterefresh 動作をプログラムすることが出来ます。この機能を提供するいくつかの関数とプロシージャーが提供されます。