MessageBox.Show会导致服务器端的超时问题吗?

时间:2017-04-12 13:33:41

标签: c# sql-server ssis try-catch job-scheduling

我的服务器上有script task SQL Server Agent的预定SSIS包。我确实为SQL连接设置了timeout,对于Try块中的一些代码,它会抛出错误,MessageBox.Show内有Catch块。如果我按原样保留代码,它将无法完成工作,但如果我注释掉那些MessageBox.Show并将Catch块留空仅用于测试目的,则作业成功运行。

有人知道MessageBox.Show会影响服务器端连接的timeout,或者在禁用显示错误消息后究竟是什么导致这种不同的结果?

提前致谢:)

3 个答案:

答案 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)

如果在Visual Studio ssdt之外执行,

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的“交互模式”来解决此问题。