我的服务器上有script task
SQL Server Agent
的预定SSIS包。我确实为SQL连接设置了timeout
,对于Try
块中的一些代码,它会抛出错误,MessageBox.Show
内有Catch
块。如果我按原样保留代码,它将无法完成工作,但如果我注释掉那些MessageBox.Show
并将Catch
块留空仅用于测试目的,则作业成功运行。
有人知道MessageBox.Show
会影响服务器端连接的timeout
,或者在禁用显示错误消息后究竟是什么导致这种不同的结果?
提前致谢:)
答案 0 :(得分:6)
在DTS中,您可以创建UI交互,这将导致程序包无限期地等待按钮单击继续。
SSIS尝试通过确定它是否在" interactive mode"中运行来解决此问题。这与Hadi的答案类似,但不同之处在于仅在BIDS / SSDT / Visual Studio之外运行SSIS包不足以触发交互模式标志未设置。
尝试从以非交互模式运行的SSIS包与UI进行交互将导致从代码中抛出异常。
如果我在脚本任务中添加消息框,我发现一个有用的模式是将System :: InteractiveMode变量作为ReadOnly变量添加到Task中,然后使用以下
bool interactiveMode = (bool) Dts.Variables["System::InteractiveMode"].Value;
if (interactiveMode)
{
// UI code here
MessageBox.Show("Something happened");
}
我发现以上内容更清晰,因为相同的代码可以部署到生产环境中,也可以在我的桌面上运行而不是"一切正常,一秒钟我做出更改以删除我的调试垫片" ...并修复本可以做得更好的一点代码
作为最后一点,我还发现使用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;
}
现在,当我运行包时,Visual Studio中的输出选项卡(我可以在其中全部选择)+图形结果选项卡将包含所有这些信息消息。当我运行软件包时,如果我使用软件包部署模型使用2005/2008或2012+,我需要确保我有/rep eiw
的参数来捕获工作中的错误,信息和警告事件日志或控制台或其他(默认情况下仅报告错误)。 2012+与项目部署模型将自动捕获信息到SSISDB.catalog.operation_messages表。
答案 1 :(得分:1)
Messagebox.show
将抛出异常。删除它时,catch块为空,因此ur脚本将忽略异常(空catch块=无错误处理,只是忽略)。
如果您删除了try.. catch
阻止,则会触发异常并显示一条消息。
超时可能是由Messagebox.show
答案 2 :(得分:1)
我知道这很古老,但是以防万一它可以帮助其他遇到我同样问题的人。
我的程序包始终在SSDT中工作,并在错误情况下提供有用的日志消息。但是,当它在生产中失败时,我所得到的只是模糊的"Exception has been thrown by the target of an invocation."
消息,什么都没有记录。
事实证明,我在调用Dts.Log之前愚蠢地向{catch块添加了MessageBox.Show
。我通过实现如上所述的billinkc的“交互模式”来解决此问题。