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

Will MessageBox.Show cause the timeout issue on server side?

我在我们的服务器上的 SQL Server Agent 中有一个带有 script task 的预定 SSIS 程序包。我确实为 SQL 连接设置了 timeout,对于 Try 块内的某些代码,它会抛出错误,并且 MessageBox.ShowCatch块。如果我按原样保留代码,它将导致作业失败,但如果我注释掉那些 MessageBox.Show 并将 Catch 块留空只是为了测试目的,作业 运行 就会成功。

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

提前致谢:)

Messagebox.show在visual studiossdt之外执行会抛出异常。当你删除它时,catch 块是空的,所以你的脚本将忽略异常(空 catch 块 = 没有错误处理,只是忽略)。

如果您删除了 try.. catch 块,将抛出异常并显示一条消息。

可能是Messagebox.show

抛出的异常导致超时

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

SSIS 试图通过确定它是否在“interactive mode”中 运行ning 来解决这个问题。这与 Hadi 的回答类似,但不同之处在于 运行仅在 BIDS/SSDT/Visual Studio 之外安装 SSIS 包不足以触发取消设置交互模式标志。

尝试在非交互模式下与 SSIS 包 运行 中的 UI 交互将导致代码抛出异常。

如果我将消息框添加到脚本任务,我发现一个有用的模式是将 System::InteractiveMode 变量作为只读变量添加到任务,然后使用以下

bool interactiveMode = (bool) Dts.Variables["System::InteractiveMode"].Value;
if (interactiveMode)
{
    // UI code here
    MessageBox.Show("Something happened");
}

我发现上面的代码更清晰,因为可以将相同的代码部署到生产环境中,并且 运行 在我的桌面上而不是 "Everything works and one second while I make changes to remove my debugging shims" ...做得更好

作为最后一点,我还发现使用 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 中的输出选项卡(我可以 select 全部)+ 图形结果选项卡将包含所有这些信息消息。当我 运行 包时,如果我使用 2005/2008 或 2012+ 包部署模型,我需要确保我有 /rep eiw 的参数来捕获错误、信息和警告事件以作业日志或控制台或其他任何内容(默认情况下仅报告错误)。 2012+ 使用项目部署模型会自动捕获信息到 SSISDB.catalog.operation_messages table.

我知道这是旧的,但以防万一它可以帮助其他人遇到同样的问题。

我的包总是在 SSDT 中工作,并在错误情况下提供有用的日志消息。但是,当它在生产中失败时,我得到的只是模棱两可的 "Exception has been thrown by the target of an invocation." 消息,没有任何记录。

原来我在调用 Dts.Log 之前愚蠢地在我的 catch 块中添加了一个 MessageBox.Show。我通过实施 "interactive mode" 解决了这个问题,如上文所述。