尝试删除不存在的表时出现FireDAC TFDScript错误

时间:2017-02-28 07:58:01

标签: delphi firedac delphi-10.1-berlin

在尝试删除不存在的表时执行Firedac TFDScript错误时出现了一个令人讨厌的错误:

  • Delphi Berlin 10.1 Upd 2
  • 数据库Firebird 2.5

调用FDScript.ExecuteAll时出错(它传递FDScript.ValidateAll没有任何问题)

我正在执行的代码如下:

FDScript: TFDScript;

{...}

begin
  FDScript.ScriptOptions.Reset;
  FDScript.SQLScripts.Clear;
  FDScript.SQLScriptFileName := '';
  FDScript.ScriptOptions.CommandSeparator := ';';
  FDScript.ScriptOptions.CommitEachNCommands := 1;
  FDScript.ScriptOptions.DropNonexistObj := True;  // seems to ignore this directive

  FDConnection.StartTransaction;
  try
    FDScript.SQLScripts.Add.SQL.Add('drop table countries;');     

    FDScript.ValidateAll; // no errors here

    ScriptStatus := GetEnumName(TypeInfo(TFDScriptStatus), Ord(FDScript.Status));
    if FDScript.Status = ssFinishSuccess then begin

      FDScript.ExecuteAll; // ERROR HERE! TABLE COUNTRIES DOES NOT EXIXTS

      if FDScript.TotalErrors = 0 then begin
        FDConnection.Commit;
      end
      else begin
        FDConnection.Rollback;
      end;
    end
    else begin
      FDConnection.Rollback;
    end;
  except
    FDConnection.Rollback;
    raise;
  end;
end;

1 个答案:

答案 0 :(得分:0)

实施似乎是正确的。引擎检查引发的异常是否为ekObjNotExists种,如果是,则DropNonexistObj属性已启用且命令类型为 DROP ALTER ,它会记录到它的控制台。否则重新引发捕获的异常。

唯一的解释是,您正在看到调试器显示的异常消息对话框。即使对于已处理的异常,也会显示这些对话框(只要您不想将它们添加到忽略列表中或关闭此功能,您就不应该这样做。)