[enter image description here我正在尝试捕获调试器通知文本,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;
如果您向我们展示您要执行的脚本,那真的很有帮助,或至少是无法正确执行的脚本。无论如何,您的代码是错误的因为documentation州
优良做法是在ExecuteAll方法之前调用ValidateAll方法。
注意“之前”。您的ValidateAll
在ExecuteAll
之后,而不是之前。两者都是布尔值函数,但您不检查它们的结果,应该这样做。
通过一些微不足道的实验,我发现我可以引发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;
他们无怨无悔地执行,我得到的行为与我在没有他们描述的情况下完全一样。