LON*_*ONG 2 c# sql-server ssis try-catch job-scheduling
我有一个预定的SSIS包,我们的服务器上有一个script taskin SQL Server Agent.我确实设置了timeoutSQL连接,对于Try块内部的一些代码,它会抛出错误,并且MessageBox.Show在Catch块内部.如果我按原样保留代码,它将无法完成工作,但如果我注释掉那些MessageBox.Show并将Catch块留空仅用于测试目的,则作业成功运行.
有人知道这MessageBox.Show会影响timeout服务器端的for连接,或者在禁用显示错误消息后究竟是什么导致了这种不同的结果?
提前致谢 :)
在DTS中,您可以创建UI交互,这将导致程序包无限期地等待按钮单击继续.
SSIS尝试通过确定它是否以" 交互模式 " 运行来解决此问题.这与Hadi的答案类似,但不同之处在于仅在BIDS/SSDT/Visual Studio之外运行SSIS包不足以触发交互模式标志未设置.
尝试从以非交互模式运行的SSIS包与UI进行交互将导致从代码中抛出异常.
如果我将消息框添加到脚本任务,我发现一个有用的模式是将System :: InteractiveMode变量作为ReadOnly变量添加到任务,然后使用以下
bool interactiveMode = (bool) Dts.Variables["System::InteractiveMode"].Value;
if (interactiveMode)
{
// UI code here
MessageBox.Show("Something happened");
}
Run Code Online (Sandbox Code Playgroud)
我觉得上面的内容更清晰,因为相同的代码可以部署到生产环境中,也可以在我的桌面上运行,而"一切正常,一秒钟我做出更改以删除我的调试垫片"......并修复了一小段代码本可以做得更好
作为最后一点,我还发现使用UI元素的形式不好,因为我很懒,不想截图或写下他们说的话.相反,请Dts.Events.FireInformation在包中使用该事件.例如,这个通用代码将枚举所有变量(我已经检查为readonly或readwrite)及其值.
public void Main()
{
bool fireAgain = false;
string message = "{0}::{1} : {2}";
foreach (var item in Dts.Variables)
{
Dts.Events.FireInformation(0, "SCR Echo Back", string.Format(message, item.Namespace, item.Name, item.Value), string.Empty, 0, ref fireAgain);
}
Dts.TaskResult = (int)ScriptResults.Success;
}
Run Code Online (Sandbox Code Playgroud)
现在,当我运行包时,Visual Studio中的输出选项卡(我可以在其中全部选择)+图形结果选项卡将包含所有这些信息消息.当我运行软件包时,如果我使用的是软件包部署模型的2005/2008或2012+,我需要确保我有一个参数/rep eiw来捕获错误,信息和警告事件到作业日志或控制台或其他任何东西(默认是仅报告错误).2012+与项目部署模型将自动捕获信息到SSISDB.catalog.operation_messages表.