Я конвертирую приложение, написанное в DBExpress, для использования новых компонентов FireDAC. Основные функции, такие как открытие запроса, изменение фильтра или упорядочения, отображение в сетке, работают правильно. Но я удивлен, что некоторые функции ведут себя по-другому по сравнению с dbexpress, и я не могу понять его.FireDAC ApplyUpdates и управление транзакциями
Мое приложение содержит редактор базы данных. Когда пользователь открывает редактор, начинается новая транзакция путем вызова метода TFDConnection::StartTransaction
. Когда пользователь нажимает кнопку OK, активная транзакция фиксируется, и редактор закрывается.
В редакторе я использую два запроса для редактирования записей. В первом запросе я вручную составляю команду SQL update (например, «update TEST set NAME='some name' where ID=1234
») и выполняю ее. Все идет нормально.
Второй запрос связан с TDBAdvGrid
(эквивалент TDBGrid
от TMS Software компании) и имеют CachedUpdates = true
. Если я изменю некоторую запись в этой сетке, я вызываю TFDQuery::Post
и TFDQuery::ApplyUpdates
.
Странное имя TFDQuery::ApplyUpdates
фиксирует не только ожидающие изменения в этом конкретном запросе, но и все запросы, связанные с экземпляром TFDConnection
. Я думал, что вызов ApplyUpdates
должен вызывать вызовы SQL-запросов, но не должен мешать управлению транзакциями.
Я хочу дать пользователю возможность отклонить все сделанные им изменения в окне редактора базы данных. Как это сделать правильно? Должен ли я отложить вызов до ApplyUpdates
во время закрытия окна? Какова же цель TFDQuery::CommitUpdates
и TFDConnection::Commit
, если все, что необходимо, это вызов TFDQuery::ApplyUpdates
?