【问题标题】:Get exception text from FireDAC debugger notification从 FireDAC 调试器通知中获取异常文本
【发布时间】:2020-05-16 01:22:11
【问题描述】:

我正在尝试捕获调试器通知文本,Firedac 连接

//FDScript1.SQLScripts.Add.SQL.LoadFromFile('C:\SGI\Rodar_Apos_Atualizar_3.txt');
//FDScript1.ValidateAll;
//FDScript1.ExecuteAll;
//MSScript1.SQL.LoadFromFile('C:\SGI\Rodar_Apos_Atualizar_3.txt');
//MSScript1.Execute;
try
  FDConnection1.Connected := True;
  FDScript1.SQLScripts.Add.SQL.LoadFromFile('C:\SGI\Rodar_Apos_Atualizar_3.txt');
  FDScript1.ExecuteAll;
  FDScript1.ValidateAll;
except
//EMSSQLNativeException
  on E: EMSSQLNativeException do
  begin
    //ShowMessage('Erro'+FDGUIxErrorDialog1.ErrorDialog.Caption);

    //Memo1.Clear;
    Memo1.Text := 'Erro de Sistema: '+#13#10+ E.Message;
  end;
end;

【问题讨论】:

  • 而且,您的实际问题是……究竟是什么?
  • 错误消息似乎在谈论关键字“ON”附近的语法错误。当错误发生时您没有告诉我们正在执行什么脚本,我们读者怎么可能知道语法错误?
  • 他想要的是阻止调试器消息框出现。
  • 嗨@Olivier。恐怕我不听你的评论,或者我错过了你的观点。如果 Sql Server 报告语法错误,我们需要知道“语法错误在什么地方,到底是什么?”的答案。不是吗?
  • @MartynA 当然,但现在他的问题是正确捕获异常以按照他想要的方式显示错误消息,记录它或其他方式。看看他的代码,他试图捕捉EMSSQLNativeException ,但调试器仍然出现。不知道为什么。

标签: delphi delphi-xe2 firedac


【解决方案1】:

如果您能向我们展示您尝试执行的脚本,那真的会有所帮助, 或者至少是没有正确执行的脚本。无论如何,您的代码是错误的 因为documentation 状态

最好在 ExecuteAll 方法之前调用 ValidateAll 方法。

注意“之前”。你的ValidateAllExecuteAll 之后,而不是之前。两者都是布尔值 函数,但你没有检查它们的结果,你应该这样做。

通过一些简单的实验,我发现我可以引发 EMSSQLNativeException 使用带有以下代码的 SqlServer 2014:

procedure TForm2.Button1Click(Sender: TObject);
const
  sScript = 'select m.*, d.* from master m join detail d on, m.masterid = d.masterid';
var
  FDScript : TFDSqlScript;
begin

  try
    FDConnection1.Connected := True;
    FDScript := FDScript1.SQLScripts.Add;
    FDScript.SQL.Text := sScript;
    //FDScript1.ExecuteAll;
    //FDScript1.ValidateAll;
    // FDScript1.ValidateAll then
      //FDScript1.ExecuteAll;

    FDQuery1.SQL.Text := sScript;
    FDQuery1.Open();
  except
  //EMSSQLNativeException
    on E: EMSSQLNativeException do
    begin
      //ShowMessage('Erro'+FDGUIxErrorDialog1.ErrorDialog.Caption);

      //Memo1.Clear;
      Memo1.Text := 'Erro de Sistema: '+#13#10+ E.Message;
    end;
  end;
end;

注意Sql语句中明显错误的语法,即on后面的逗号。

当调用FDQuery1.Open 时,会引发此异常(并最初被调试器捕获)

---------------------------
Debugger Exception Notification
---------------------------
Project sqlerror.exe raised exception class EMSSQLNativeException with message '[FireDAC][Phys][ODBC][Microsoft][SQL Server Native Client 11.0][SQL Server]Incorrect syntax near 'd'.'.
---------------------------
Break   Continue   Help
---------------------------

当我单击继续时,执行将进入您的异常处理程序,正如 @TomBrunberg 在评论中描述的那样 并将异常的消息文本插入到 Memo1 中。

因此,我无法根据您问题中的信息重现您描述的行为。它 一定是由您没有告诉我们的事情引起的,可能在您拥有的代码中 未包含在您的 q 或您所在组件的某些属性设置中 使用。

希望,尝试上面的代码,你会发现调试器的行为和我一样 已经描述了,这可能会给你一些线索,说明你为什么会得到 你描述的问题。请注意,尝试代码非常重要 上面是一个新项目,而不是您现有的项目。唯一的属性设置 在执行它之前你需要做的是设置 FDConnection1 以便它可以连接 到您的服务器。

FWIW,如果我取消注释掉这些行

    FDScript1.ValidateAll then
      FDScript1.ExecuteAll;

他们毫无怨言地执行,我得到的行为与我在没有他们的情况下描述的完全相同。

【讨论】:

  • 哦,太好了。那么请随时点击左侧的“勾号”图标来接受此答案。
猜你喜欢
  • 2013-02-18
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
  • 2014-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多