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



我有一个计划的 SSIS 包,在我们的服务器上SQL Server Agentscript task。我确实为 SQL 连接设置了timeout,对于Try块中的某些代码,它会抛出错误,并且Catch块内有MessageBox.Show。如果我保持代码不变,它将使作业失败,但是如果我注释掉这些MessageBox.Show并将Catch块留空只是出于测试目的,则作业成功运行。

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

提前致谢:)

在 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");
}

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

最后一点,我还发现使用 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表中。

如果Messagebox.show在Visual Studio SSDT外部执行,则会引发异常。删除它时,catch 块为空,因此脚本将忽略异常(空 catch 块 = 没有错误处理,只是忽略)。

如果您删除了try.. catch块,则会引发异常并显示一条消息。

超时可能是由Messagebox.show引发的异常引起的

我知道这很旧,但以防万一它可以帮助其他人解决与我相同的问题。

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

事实证明,在调用 Dts.Log 之前,我愚蠢地在我的 catch 块中添加了一个MessageBox.Show。我通过实现上述 billinkc 的"交互模式"来解决此问题。

最新更新