更新オブジェクトを使ったデータセットの更新
BDE を使用した更新情報のキャッシュ:インデックス への移動
メモ: BDE(Borland Database Engine)は非推奨になったため、今後は機能強化されません。たとえば、BDE では Unicode はサポートされません。BDE を使用して新たに開発しないことをお勧めします。既存のデータベース アプリケーションを BDE から dbExpress に移行することを検討してください。BDE から dbExpress への移行についての詳細は、http://www.embarcadero.com/rad-in-action/migration-upgrade-center を参照してください。
BDE 対応データセットが表しているストアド プロシージャやクエリが "ライブ" でない場合、データセットから更新を直接適用することはできません。そのようなデータセットでは、クライアント データセットを使って更新のキャッシュを行った場合にも問題が発生する可能性があります。更新のキャッシュに BDE 対応データセットとクライアント データセットのどちらを使用している場合でも、更新オブジェクトを使用することで、データセットの問題に対処することができます。
データセットを更新するには:
- クライアント データセットを使用している場合は、TBDEClientDataSet ではなく TClientDataSet を外部プロバイダ コンポーネントと一緒に使用します。これは、BDE 対応ソース データセットの UpdateObject プロパティを設定できるようにするためです(手順 3)。
- Bde.DBTables.TUpdateSQL コンポーネントを、BDE 対応データセットと同じデータ モジュールに追加します。
- BDE 対応データセット コンポーネントの UpdateObject プロパティをデータ モジュール内の TUpdateSQL コンポーネントに設定します。
- 更新オブジェクトの ModifySQL、InsertSQL、DeleteSQL の各プロパティを使って、更新を実行するために必要な SQL 文を指定します。SQL 更新エディタを使ってこれらの SQL 文を組み立てることができます。
- データセットを閉じます。
- データセット コンポーネントの CachedUpdates プロパティを True に設定するか、データセット プロバイダを使ってデータセットをクライアント データセットにリンクします。
- データセットを開き直します。
メモ: 複数の更新オブジェクトを使用しなければならない場合があります。たとえば、複数テーブルにまたがる結合を更新する場合や、複数のデータセットのデータを表すストアド プロシージャを更新する場合には、更新対象のテーブルごとに 1 つの TUpdateSQL オブジェクトが必要になります。複数の更新オブジェクトを使用する場合、UpdateObject プロパティを設定するだけで更新オブジェクトとデータセットを関連付けることはできません。Bde.DBTables.TBDEDataSet.OnUpdateRecord イベント ハンドラから(BDE を使用して更新情報をキャッシュするときに)更新オブジェクトを手動で呼び出す必要があります。
更新オブジェクトには、実際には 3 つの TQuery コンポーネントがカプセル化されています。クエリ コンポーネントのそれぞれが、1 つの更新タスクを実行します。1 つ目のクエリ コンポーネントは既存レコードを変更するための SQL UPDATE 文を、2 つ目のクエリ コンポーネントはテーブルに新しいレコードを追加するための INSERT 文を、3 つ目のコンポーネントはテーブルからレコードを削除するための DELETE 文を、それぞれ提供します。
更新コンポーネントをデータ モジュールに配置したときには、そこにカプセル化されたクエリ コンポーネントは見えません。クエリ コンポーネントは、以下の 3 つの更新プロパティに指定した SQL 文を基に、実行時に更新コンポーネントによって作成されます。
実行時に更新コンポーネントを使って更新を適用すると、以下の処理が行われます。
- 現在のレコードに対して行われている処理が変更か挿入か削除かに応じて、実行する SQL 文を選択します。
- SQL 文のパラメータの値を指定します。
- SQL 文の準備と実行を行って、指定された更新を行います。