Я конвертирую приложение, написанное на DBExpress, для использования новых компонентов FireDAC. Основные вещи, такие как открытие запроса, изменение фильтра или порядка, отображение в сетке, работают правильно. Но я удивлен, что некоторые функции ведут себя по-другому по сравнению с dbexpress, и я не могу этого понять.
Мое приложение содержит редактор базы данных. Когда пользователь открывает редактор, новая транзакция запускается вызовом метода TFDConnection::StartTransaction
. Когда пользователь нажимает кнопку «ОК», активная транзакция фиксируется, и редактор закрывается.
В редакторе я использую два запроса для редактирования записей. В первом запросе я вручную составляю команду обновления SQL (например, «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
?