1

Я конвертирую приложение, написанное в 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?

ответ

0

Set TFDConnection :: TxOptions :: StopOptions :: xoIfCmdsInactive to false. Это также отключит опцию TFDConnection :: TxOptions :: AutoCommit и приложение может самостоятельно управлять транзакциями.