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

标签 delphi firebird error-code

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

执行顺序:

  • 检查当前版本(从 Firebird 数据库中选择语句)
  • 下载更新(通过 FTP)
  • 应用它(.exe 文件,并执行.sql)

当我尝试执行 .SQL 文件时,弹出错误代码 -901。我知道 W7 64x 和 FDB 32x 存在不兼容问题,但是,我可以做一切:备份和恢复(gb​​ak)、DB 命令(全部)。我尝试使用 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)

最佳答案

该错误表明您遇到了“COMMIT WORK;”之类的情况在你的sql脚本中。

根据 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)

关于delphi - 从 Delphi 执行脚本时出现错误 "invalid transaction handle (expecting explicit transaction start)",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39471426/

相关文章:

delphi - 如何加载JPE图像文件?

jdbc - Jaybird(Firebird JDBC)absolute()方法

delphi - 无需刷新 FMX 控件

algorithm - 对包含 7 个整数的数组进行排序的最快方法是什么?

sql - Firebird sql更新命令在delphi中不起作用

c++ - 我们真的需要 std::error_category 和 std::error_condition 吗?

c++ - rsa_public_encrypt 返回-1,错误0x0406B07A

Python SMTP 错误代码处理

delphi - 如何防止在表单未处于事件状态时触发快捷方式

php - 相当于 mysql_num_rows() 的 Interbase/Firebird