Является ли это ошибкой или нет?

Обсуждение возникших проблем, предложений и ошибок IBDAC компонентов
Ответить
MikeV
Сообщения: 1
Зарегистрирован: Вс 19 авг 2018 13:20

Является ли это ошибкой или нет?

Сообщение MikeV » Вс 19 авг 2018 13:32

TUniQuery.SQL.Text := 'SELECT * FROM TABLE';

TUniQuery.Open;

TUniQuery.Last;

while not TUniQuery.Eof do //Всегда возвращает False и никогда не выполняет цикл
begin
TUniQuery.Next;
end;

TUniQuery.Open;
TUniQuery.First; // Не обязательно, всегда открывает начиная с 1 записи

while not TUniQuery.Eof do //Условие выполняется и все записи прочитаны
begin
TUniQuery.Next;
end;

Я думаю, что после вызова процедуры TUniQuery.Last; условие 'while not TUniQuery.Eof do' должно выполниться один раз и только после проедуры TUniQuery.Next; вернуть False.

Второй вопрос по поводу транзакций.
TUniQuery.SpecificOtions.AutoCommit := True;
TUniQuery.SQL.Text := 'UPDATE TABLE ..';
TUniQuery.Transaction := TUniTransaction;
TUniTransaction.StartTransaction;
TUniQuery.ExecSQL;
TUniTransaction.Active = True ? // Всегда возвращает True

Я думаю, что после вызова процедуры TUniQuery.ExecSQL; условие TUniTransaction.Active должно возвращать False, т.к. либо транзакция закончилась Commited, либо RollBack, в любом случае она закончилась и повторный вызов TUniTransaction.Commit или TUniTransaction.Rollback; ни к чему не приведет, кроме как сделает условие TUniTransaction.Active = False.

Спасибо за уделенное внимание.

Delphi 7 + Unidac 7.2.7

ViktorV
Devart Team
Сообщения: 199
Зарегистрирован: Чт 31 июл 2014 09:52

Re: Является ли это ошибкой или нет?

Сообщение ViktorV » Вт 21 авг 2018 09:48

1. Компоненты TUniQuery является наследником базового класса TDataSet и реализуют его интерфейс. Как указано в документации http://docwiki.embarcadero.com/Librarie ... ataSet.Eof свойство Eof устанавливается в True при вызове метода Last.
2. Свойство AutoCommit по-умолчанию имеет значение True, что приводит к автоматическому выполнению CommitRetaining или RollbackRetaining при любой модификации данных. Установив свойство в False, Вы избавитесь от такого поведения, однако, управлять транзакциями Вам придется самостоятельно.
Так как вы устанавливаете UniConnection.AutoCommit в True при вызове TUniQuery.ExecSQL будет автоматически вызван метод TUniTransaction.CommitRetaining.
Если вам требуется ручное управление транзакций - установите TUniQuery.AutoCommit в False.

Ответить