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

2024-01-22

我有一个预定的 SSIS 包,其中包含script task in SQL Server Agent在我们的服务器上。我确实设置了timeout对于SQL连接,以及里面的一些代码Try块,它会抛出错误,并且有MessageBox.Show在 - 的里面Catch堵塞。如果我保留代码原样,它将导致工作失败,但是如果我注释掉这些代码MessageBox.Show并留下Catch块空白仅用于测试目的,作业运行成功。

任何人都知道MessageBox.Show将影响timeout对于服务器端的连接或者禁用显示错误消息后到底是什么导致了这种不同的结果?

提前致谢 :)


在 DTS 中,您可以创建 UI 交互,这将导致包无限期地等待按钮单击以继续。

SSIS 尝试通过确定它是否在“中运行”来解决此问题交互模式 https://learn.microsoft.com/en-us/sql/integration-services/system-variables这与 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");
}

我发现上面的内容更干净,因为相同的代码可以部署到生产环境中,也可以在我的桌面上运行,而不是“一切正常,一秒钟,当我进行更改以删除调试垫片时”......并修复那一点点代码本来可以做得更好

最后一点,我还发现使用 UI 元素的形式很糟糕,因为我很懒,不想截图或写下它们所说的内容。相反,请使用Dts.Events.FireInformation您的包裹中的活动。例如,此通用代码将枚举所有变量(我已将其检查为只读或可读写)及其值。

    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 表中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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