Ich konvertiere Anwendung in DBExpress geschrieben, um neue FireDAC-Komponenten zu verwenden. Die grundlegenden Dinge wie das Öffnen der Abfrage, das Ändern des Filters oder Sortierens, das Anzeigen im Raster funktionieren ordnungsgemäß. Aber ich bin überrascht, dass sich einige Funktionen im Vergleich zu dbexpress anders verhalten und ich das nicht nachvollziehen kann.FireDAC ApplyUpdates und Transaktionssteuerung
Meine Anwendung enthält Datenbankeditor. Wenn der Benutzer den Editor öffnet, wird die neue Transaktion durch Aufrufen der Methode TFDConnection::StartTransaction
gestartet. Wenn der Benutzer auf OK klickt, wird die aktive Transaktion festgeschrieben und der Editor geschlossen.
Im Editor verwende ich zwei Abfragen, um Datensätze zu bearbeiten. In der ersten Abfrage erstelle ich den SQL Update Befehl (wie "update TEST set NAME='some name' where ID=1234
") manuell und führe ihn aus. So weit, ist es gut.
zweite Abfrage ist mit TDBAdvGrid
(entspricht TDBGrid
von TMS Software Firma) und CachedUpdates = true
haben. Wenn ich einen Datensatz in diesem Raster ändere, rufe ich TFDQuery::Post
und TFDQuery::ApplyUpdates
.
Whats seltsame Aufruf TFDQuery::ApplyUpdates
Commits nicht nur ausstehende Änderungen in dieser spezifischen Abfrage, sondern alle Abfragen mit Instanz TFDConnection
verbunden. Ich dachte, dass der Aufruf von ApplyUpdates
SQL-Update-Aufrufe ausgeben sollte, aber die Transaktionssteuerung nicht beeinträchtigen sollte.
Ich möchte dem Benutzer die Option geben, alle von ihm vorgenommenen Änderungen im Datenbankeditorfenster abzulehnen. Wie mache ich das richtig? Sollte ich den Anruf auf ApplyUpdates
auf Zeit beim Schließen des Fensters verschieben? Was ist dann der Zweck von TFDQuery::CommitUpdates
und TFDConnection::Commit
, wenn alles, was notwendig ist, ist der Anruf von TFDQuery::ApplyUpdates
?