从SSIS的ScriptTask调用电子邮件OnError
我有一个简单的SSIS包,上面有一个脚本任务。我有一个带有发送邮件任务的OnError事件 我所做的只是测试,看看当我检测到脚本出错时是否可以发送电子邮件。 但是,用于保存电子邮件错误消息的变量会导致错误 尝试为读取访问锁定变量“User::errMsg”时检测到死锁 下面是非常简单的脚本从SSIS的ScriptTask调用电子邮件OnError,ssis,sendmail,onerror,Ssis,Sendmail,Onerror,我有一个简单的SSIS包,上面有一个脚本任务。我有一个带有发送邮件任务的OnError事件 我所做的只是测试,看看当我检测到脚本出错时是否可以发送电子邮件。 但是,用于保存电子邮件错误消息的变量会导致错误 尝试为读取访问锁定变量“User::errMsg”时检测到死锁 下面是非常简单的脚本 public void Main() { try { int x = 2; if
public void Main()
{
try
{
int x = 2;
if (x ==2)
{
throw new Exception("The number was 2");
}
Dts.TaskResult = (int)ScriptResults.Success;
}
catch(Exception e)
{
Dts.Variables["errMsg"].Value = e.Message;
Dts.Events.FireError(-1, "here", "my error", "", 0);
Dts.TaskResult = (int)ScriptResults.Failure;
}
当脚本任务中发生错误时,我如何将消息传递给发送电子邮件?SSIS变量被
锁定
,并且仅在其执行后事件中被释放。在您的情况下,errMsg
变量被脚本任务锁定,同时在错误事件中被SendMail
组件创建了一个死锁
情况。在变量执行阶段被其他组件访问之前,您需要明确地解锁该变量
试试这个:-
catch (Exception e)
{
Variables lockedVariables = null;
Dts.VariableDispenser.LockOneForWrite("errMsg", ref lockedVariables);
lockedVariables["errMsg"].Value = e.Message;
lockedVariables.Unlock();
Dts.Events.FireError(-1, "here", "my error", "", 0);
Dts.TaskResult = (int)ScriptResults.Failure;
}
这将确保在错误发生之前,变量被解锁,并且可以在执行事件中访问,例如On error
或OnExecStatusChanged
更多关于如何处理此类死锁的信息由Todd McDermid在他的文章中解释