MessageBox.Show 会导致服务器端超时问题吗?
Will MessageBox.Show cause the timeout issue on server side?
我在我们的服务器上的 SQL Server Agent
中有一个带有 script task
的预定 SSIS 程序包。我确实为 SQL 连接设置了 timeout
,对于 Try
块内的某些代码,它会抛出错误,并且 MessageBox.Show
在 Catch
块。如果我按原样保留代码,它将导致作业失败,但如果我注释掉那些 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" 解决了这个问题,如上文所述。
我在我们的服务器上的 SQL Server Agent
中有一个带有 script task
的预定 SSIS 程序包。我确实为 SQL 连接设置了 timeout
,对于 Try
块内的某些代码,它会抛出错误,并且 MessageBox.Show
在 Catch
块。如果我按原样保留代码,它将导致作业失败,但如果我注释掉那些 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" 解决了这个问题,如上文所述。