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