我有一个循环通过连接循环。每个循环连接到不同的连接,然后加载表等。在第二步中它连接然后将数据加载到DWH中。有时连接因任何原因而关闭,并且在此步骤中将失败。我需要包来继续这个连接失败。
我已经读了很多关于propogate设置为false的东西,但这仍然无效。正如你在我的屏幕截图中看到的,我有"加载......" onError事件处理程序propogate设置为false,并且Sequence容器onError propogate设置为false。
我还尝试将序列容器最大错误设置为0以便该部分完成,并且在"加载..."的onError上。在变量中设置一个标志,以便在连接完成时继续运行,或者在连接失败时停在那里。
我在过去已经完成了这项工作,并且只是在完成时将整个包完成状态设置为成功,但是这不会捕获此循环中可能发生的其他错误,我将需要捕获/失败包。
任何帮助都将不胜感激。
答案 0 :(得分:2)
对连接失败进行更多研究,我找到了Jamie Thomson撰写的一个脚本:Verify a connection before using it [SSIS]。
我根据自己的用法修改了一下:
FireError
我做了FireWarning
。connFail
),设置为0或1,具体取决于连接是否失败。我将此脚本任务放在我的表加载之前,以在执行任务之前捕获任何失败的连接。这些修改允许我在连接失败(connfail = 1
)时触发电子邮件警报,或者如果连接成功则继续在包上(`connFail = 0')。
我使用的完整脚本如下:
bool failure = false;
bool fireAgain = true;
try
{
Dts.Connections["Connection"].AcquireConnection(null);
Dts.Events.FireInformation(1, ""
, String.Format("Connection aquired successfully on '{0}'", Dts.Connections["Connection"].Name)
, "", 0, ref fireAgain);
}
catch (Exception e)
{
Dts.Events.FireWarning(-1, ""
, String.Format("Failed to aquire connection to '{0}'. Error Message='{1}'",Dts.Connections["Connection"].Name, e.Message)
, "", 0);
failure = true;
}
if (failure)
{
Dts.TaskResult = (int)ScriptResults.Success;
Dts.Variables["connFail"].Value = 1;
}
else
{
Dts.TaskResult = (int)ScriptResults.Success;
Dts.Variables["connFail"].Value = 0;
}