从 Delphi 执行脚本时出错 "invalid transaction handle (expecting explicit transaction start)"

Error "invalid transaction handle (expecting explicit transaction start)" executing script from Delphi

我正在用 Delphi 10 开发更新应用程序。我是 运行 Windows 7 64x,FireBird 2.5.1.26351 32x。

执行顺序:

当我尝试执行 .SQL 文件时弹出错误代码 -901。我知道 W7 64x 和 FDB 32x 存在不兼容问题,但是,我可以做任何事情:备份和恢复 (gbak)、数据库命令 (all)。我尝试使用 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)

该错误表明您的 sql 脚本中有类似 'COMMIT WORK;' 的内容。

根据 FireDAC 文档:

Resolving Incompatibilities

Firebird ISQL works in non-autocommit mode. By default, the autocommit mode for TFDScript/TFDConnection is turned on. For better compatibility, set FDConnection.TxOptions.AutoCommit to False before the script execution. Or execute the SET AUTOCOMMIT OFF script command.

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