FireDAC, FireBird, баг AutoCommit.

SQLIntento
Дата: 12.12.2019 11:38:10
Используется связка Firebird 3.0 + Delphi XE8 + FireDAC. Есть необходимость выполнения ad hoc запросов. Поэтому нельзя определиться заранее, что использовать (ExecSQL или Open). Использование OpenOrExecute приводит к багу при стандартных настройках AutoCommit: после создания таблицы она не видна (AutoCommit не сработал). Воспроизведение:

procedure TForm1.Button1Click(Sender: TObject);
begin
  FDQuery1.SQL.Text := 'create table AAA(A int);';
  FDQuery2.SQL.Text := 'insert into AAA(A) values (1);';

  try
    FDConnection1.Connected := True;
    FDQuery1.OpenOrExecute();

    // SQL error code = -204
    // Table unknown
    FDQuery2.OpenOrExecute();

  finally
    FDQuery1.Close();
    FDQuery2.Close();
    FDConnection1.Connected := False;
  end;
end;


Чтобы обойти этот баг, в настоящее время использую ручное управление транзакциями:

    FDConnection1.TxOptions.AutoCommit := False; 
    FDConnection1.TxOptions.AutoStart := False;
    FDConnection1.TxOptions.AutoStop := False;


Можно ли как-нибудь решить проблему, не переходя к ручному управлению транзакциями?
Мимопроходящий
Дата: 12.12.2019 11:50:08

12.12.2019 11:38, SQLIntento пишет:
> Можно ли как-нибудь решить проблему, не переходя к ручному управлению транзакциями?

остыпьте и мне.
я тоже поржу.

Posted via ActualForum NNTP Server 1.5

Квейд
Дата: 12.12.2019 12:12:44
SQLIntento
Используется связка Firebird 3.0 + Delphi XE8 + FireDAC. Есть необходимость выполнения ad hoc запросов. Поэтому нельзя определиться заранее, что использовать (ExecSQL или Open). Использование OpenOrExecute приводит к багу при стандартных настройках AutoCommit: после создания таблицы она не видна (AutoCommit не сработал). Воспроизведение:

procedure TForm1.Button1Click(Sender: TObject);
begin
  FDQuery1.SQL.Text := 'create table AAA(A int);';
  FDQuery2.SQL.Text := 'insert into AAA(A) values (1);';

  try
    FDConnection1.Connected := True;
    FDQuery1.OpenOrExecute();

    // SQL error code = -204
    // Table unknown
    FDQuery2.OpenOrExecute();

  finally
    FDQuery1.Close();
    FDQuery2.Close();
    FDConnection1.Connected := False;
  end;
end;


Чтобы обойти этот баг, в настоящее время использую ручное управление транзакциями:

    FDConnection1.TxOptions.AutoCommit := False; 
    FDConnection1.TxOptions.AutoStart := False;
    FDConnection1.TxOptions.AutoStop := False;


Можно ли как-нибудь решить проблему, не переходя к ручному управлению транзакциями?
разве для DDL-выражений нужен commit?
Мимопроходящий
Дата: 12.12.2019 12:16:28

12.12.2019 12:12, Квейд пишет:
> разве для DDL-выражений нужен commit?

коммит нужен всегда.
но при определённых условиях он может выполняться автоматом.
у Оракла он автомат.

Posted via ActualForum NNTP Server 1.5

ёёёёё
Дата: 12.12.2019 13:38:26
SQLIntento
Можно ли как-нибудь решить проблему, не переходя к ручному управлению транзакциями?

SQLIntento
    // Table unknown

Подозреваю, что дак использует метаданные, загруженные при коннекте.
Создал табличку - выполни реконнект. А лучше в рантайме не создавай.
Мимопроходящий
Дата: 12.12.2019 13:45:37

12.12.2019 13:38, ёёёёё пишет:
> Создал табличку - выполни реконнект.

Картинка с другого сайта.

Posted via ActualForum NNTP Server 1.5

SQLIntento
Дата: 12.12.2019 14:02:28
ёёёёё

Создал табличку - выполни реконнект. А лучше в рантайме не создавай.


В программу для администраторов приложения включено средство администрирования СУБД, с которым работает приложение. Оно среди прочего даёт возможность набрать в редакторе произвольные запросы и выполнить их. Поэтому неизвестно, какие именно запросы (create, insert, select, ...) будет выполнять администратор приложения. В настоящий момент из-за описанного бага был осуществлён переход к ручному управлению транзакциями. В начале любого сценария выполняется "set transaction", после выполнения DDL выполняются последовательно "commit" и "set transaction". Это не очень удобно, поэтому и задал вопрос о возможности исправления бага FireDAC при работе в режиме AutoCommit.
Мимопроходящий
Дата: 12.12.2019 14:04:54

12.12.2019 14:02, SQLIntento пишет:
> в редакторе произвольные запросы и выполнить их.
> Поэтому неизвестно, какие именно запросы (create, insert, select, ...)

уже смешно

Posted via ActualForum NNTP Server 1.5

ёёёёё
Дата: 12.12.2019 14:08:44
SQLIntento
неизвестно, какие именно запросы (create, insert, select, ...) будет выполнять администратор

SQLIntento
В программу для администраторов приложения включено средство администрирования СУБД

А зачем вы создали приложение, которое позволяет вводить запросы, которые оно не может обработать?
И нафига сие вообще было делать, если есть IBExpert?
SQLIntento
Дата: 12.12.2019 14:22:50
ёёёёё

А зачем вы создали приложение, которое позволяет вводить запросы, которые оно не может обработать?


Не может только при использовании AutoCommit. Поэтому в данный момент AutoCommit не используется, произвольные запросы обрабатываются. Единственный минус, что при администрировании неудобно каждый раз писать "set transaction" и "commit".

ёёёёё

И нафига сие вообще было делать, если есть IBExpert?


От приложения требовалось предоставить встроенную функциональность по администрированию.