DBExpressで書かれたアプリケーションを新しいFireDACコンポーネントを使用するように変換しています。クエリを開く、フィルタや順序を変更する、グリッドに表示するなどの基本的なことが正しく機能しています。しかし、dbexpressと比較していくつかの関数が異なって動作することに私は驚いています。私はそれを理解しているようです。FireDAC ApplyUpdatesとトランザクションコントロール
私のアプリケーションにはデータベースエディタが含まれています。ユーザーがエディタを開くと、 メソッドTFDConnection::StartTransaction
を呼び出してトランザクションが開始されます。ユーザーが[OK]ボタンをクリックすると、アクティブなトランザクションがコミットされ、エディタが閉じます。
エディタでは、2つのクエリを使用してレコードを編集します。最初のクエリでは、手動でSQL更新コマンド( "update TEST set NAME='some name' where ID=1234
"など)を作成して実行します。ここまでは順調ですね。
2番目のクエリはTDBAdvGrid
(TDBGrid
からTMSソフトウェア会社に相当)に接続されており、CachedUpdates = true
を持っています。私がそのグリッドのレコードを変更した場合は、TFDQuery::Post
とTFDQuery::ApplyUpdates
と呼んでいます。
TFDQuery::ApplyUpdates
は、この特定のクエリでは保留中の変更だけでなく、インスタンスに接続されたすべてのクエリをTFDConnection
とします。私はApplyUpdates
の呼び出しがSQLの更新呼び出しを発行すべきだと考えましたが、トランザクション制御を妨げてはいけません。
データベースエディタウィンドウで彼が行ったすべての変更を拒否するオプションをユーザに与えたいと思います。どのように正しく行うには?ウィンドウを閉じるときにApplyUpdates
への呼び出しを延期すべきですか? TFDQuery::CommitUpdates
とTFDConnection::Commit
の目的は、TFDQuery::ApplyUpdates
の呼び出しが必要な場合はどうなりますか?