Ошибка неверный дескриптор транзакции (ожидается явный запуск транзакции) при выполнении скрипта из Delphi

Я разрабатываю приложение обновления с помощью Delphi 10. Я использую Windows 7 64x, FireBird 2.5.1.26351 32x.

Порядок исполнения:

  • Проверяет текущую версию (оператор select из базы данных Firebird)
  • Скачивает обновление (через FTP)
  • Примените его (файлы .exe и выполните .sql)

Код ошибки -901 появляется, когда я пытаюсь запустить файлы .SQL. Я знаю, что существует проблема несовместимости с W7 64x и FDB 32x, но я могу делать все: резервное копирование и восстановление (gbak), команды БД (все). Вместо этого я попробовал с FDB 64x, и он не работал.

Код:

//Components
FDWaitCursor: TFDGUIxWaitCursor;
FDDriverLink: TFDPhysFBDriverLink;
FDConnection:TFDConnection;
FDScript: TFDScript;

function TTHR_Script.CreateComponents:boolean;
begin
  try
  FDDriverLink := TFDPhysFBDriverLink.Create(FDDriverLink);
  FDWaitCursor := TFDGUIxWaitCursor.Create(FDWaitCursor);

  FDConnection := TFDConnection.Create(FDConnection);
    with FDConnection do
    begin
      DriverName := 'FB';
      Params.UserName := THRBanco.BDUser;
      Params.Password := THRBanco.BDPass;
      Params.Database := THRBanco.DIROrigem;
    end;

  FDScript := TFDScript.Create(FDScript);
    with FDScript do
    begin
      Connection := FDConnection;
      OnConsolePut := FDScript_ConsolePut;
    end;
  Result := true;
  except on E:Exception do
    begin
      Result := false;
    end;
  end;
end;

procedure TTHR_Script.ExecLogs;
var
  F : integer;
  SR : TSearchRec;
begin
  F := FindFirst(ExtractFilePath(Application.ExeName)+'\manager\update\logs\*.sql',faArchive,SR);
  FDConnection.Open;

  while F = 0 do
  begin
    with FDScript do
    begin
      SQLScripts.Clear;
      SQLScriptFileName := ExtractFilePath(Application.ExeName)+'\manager\update\logs\'+SR.Name;
      ValidateAll;
      ExecuteAll;
    end;
    Application.ProcessMessages;
    F := FindNext(SR);
  end;
  FDConnection.Close;
end;

После установки Firebird 2.5.6 по-прежнему возникала та же ошибка -901. Журнал ошибок:

update empresa set emp_verbanco='2016.55'; 
[13_09_2016 | 14:29]: Ok [00:00:00.047]. 
[13_09_2016 | 14:29]: update empresa set emp_versis='2016.55'; 
[13_09_2016 | 14:29]: Ok [00:00:00.016]. 
[13_09_2016 | 14:29]: commit work; 
[13_09_2016 | 14:29]: ERROR: Dynamic SQL Error SQL error code = -901 invalid transaction handle (expecting explicit transaction start)

person RafaelHarth    schedule 13.09.2016    source источник
comment
попробуйте Firebird 2.5.6: firebirdsql.org/en/firebird-2-5 -6 ваша версия устарела   -  person magicandre1981    schedule 13.09.2016
comment
Коды ошибок относительно бесполезны. Некоторые коды охватывают десятки различных (но связанных) ошибок. Опубликуйте фактическое сообщение об ошибке или, если у вас его нет: номер ошибки (который отличается от кода ошибки).   -  person Mark Rotteveel    schedule 13.09.2016
comment
А также опубликуйте SQL-скрипт, который вы пытаетесь выполнить.   -  person Mark Rotteveel    schedule 13.09.2016
comment
После установки Firebird 2.5.6 по-прежнему возникала та же ошибка -901. Журнал ошибок: update empresa set emp_verbanco='2016.55'; [13_09_2016 | 14:29]: Ok [00:00:00.047]. [13_09_2016 | 14:29]: update empresa set emp_versis='2016.55'; [13_09_2016 | 14:29]: Ok [00:00:00.016]. [13_09_2016 | 14:29]: commit work; [13_09_2016 | 14:29]: ERROR: Dynamic SQL Error SQL error code = -901 invalid transaction handle (expecting explicit transaction start)   -  person RafaelHarth    schedule 13.09.2016
comment
Я не могу опубликовать свой SQL-скрипт, он слишком длинный. Могу я опубликовать на pastebin, а затем выложить здесь?   -  person RafaelHarth    schedule 13.09.2016
comment
Этот сценарий отлично работает с IBExpert, но не с TFDScript (компонент сценария FireDac).   -  person RafaelHarth    schedule 13.09.2016
comment
@RafaelHarth Вы должны отредактировать свой ответ, чтобы включить информацию, а не публиковать его как комментарий (например, я отредактировал запись вашего комментария в сообщение). Ошибка указывает на то, что вы не начали транзакцию, наличие таких вещей, как commit work в сценарии, выполняемом с помощью языка программирования, обычно является красным флагом, поскольку драйверы / языки программирования обычно обрабатывают свои собственные транзакции.   -  person Mark Rotteveel    schedule 14.09.2016


Ответы (1)


Ошибка указывает на то, что у вас есть такие вещи, как «COMMIT WORK;» в вашем sql скрипте.

Согласно документации FireDAC:

Устранение несовместимости

Firebird ISQL работает в режиме без автоматической фиксации. По умолчанию режим автоматической фиксации для TFDScript / TFDConnection включен. Для лучшей совместимости установите для FDConnection.TxOptions.AutoCommit значение False перед выполнением скрипта. Или выполните команду сценария SET AUTOCOMMIT OFF.

http://docwiki.embarcadero.com/RADStudio/Berlin/en/Executing_SQL_Scripts_(FireDAC)

person dipold    schedule 23.02.2017