|
TOracleDataSet component |
Top Previous Next |
|
Unit 説明 もしdata-awareコンポーネント(DBEdit, DBGridなど)を使用したい場合、TOracleDataSetコンポーネントを使ってください。ToracleDataSetは標準TdataSetコンポーネントから派生しています。標準TdataSetからほとんどのプロパティ、メソッド、そしてイベントを受け継いでいます。これに加えて、TOracleQuery コンポーネントから派生したプロパティとメソッドもあります。 ToracleDataSetを使うため、データベースに接続するためにSessionプロパティを設定して下さい。SQLプロパティ内のデータベースに対してselect命令を入力してください。Select命令内の全ての入力変数は、Variablesプロパティ内で宣言されなくてはなりません。そして実行時にはSetVariable メソッドを通して値を割り当てられなくてはなりません。もしSessionがログオン中なら、datasetを開くためにActiveにTrueを設定できます。個々のフィールドプロパティを設定するためにdatasetのフィールドエディタを呼び出します (datasetアイコンの上で右クリック) 。標準datasourceをdatasetにリンクしたら、data-awareコンポーネントを使えるようになります。 Datasetを更新可能にします レコードを更新可能にするには、datasetは取得された全てのレコードのrowidを知っている必要があります。 Rowidはdataset内のレコードを独自に特定する内部Oracle構造体です。クエリーに含まない限りは、datasetのCanModifyプロパティはFalseのままになります。更新可能なdept datasetを作るために、SQL プロパティは: select dept.*, dept.rowid from dept 更に、更新可能なdatasetのselect命令内の更新可能なテーブルのためにカラムエイリアスを使うべきではありません。これらエイリアス名は更新テーブルに続く挿入か更新のために使われるでしょう。その結果エラーが発生します。 もしある理由でクエリー内にrowidを提供することが不可能ならば、datasetを更新可能にするためにOnApplyRecord イベントを使うことが出来ます。 Dataset内の派生したフィールドを選択します 時に、一つのテーブルのカラムではないdatasetのフィールドを選択する必要があります。Select命令内で計算を行うことができ、格納された関数を呼び出し、他のテーブルからカラムを接続することが出来ます。 Dataset内に派生フィールドを作成するためにいくつかのルールが適用されます:
次のサンプルは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イベント、そしてdatasetのBeforePostイベントなどです。 しかしながら、Oracleの強みのひとつにデータベース内のデータインテグリティ(整合性)を保障する能力があります。宣言型の整合性チェックに、primary key、unique key、foreign 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をご覧ください。 複合クエリー結果を更新する 時に、クエリーが複雑すぎてシンプルテーブルを通して更新することが出来ないかもしれません。ToracleDataSetはOnApplyRecord イベントをもち、これでlock, insert, update, deleteとrefresh 動作をプログラムすることが出来ます。この機能を提供するいくつかの関数とプロシージャーが提供されます。 |