FireDAC ApplyUpdates и управление транзакциями

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


person truthseeker    schedule 18.04.2016    source источник


Ответы (1)


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

person truthseeker    schedule 19.04.2016