从SSIS的ScriptTask调用电子邮件OnError

从SSIS的ScriptTask调用电子邮件OnError,ssis,sendmail,onerror,Ssis,Sendmail,Onerror,我有一个简单的SSIS包,上面有一个脚本任务。我有一个带有发送邮件任务的OnError事件 我所做的只是测试,看看当我检测到脚本出错时是否可以发送电子邮件。 但是,用于保存电子邮件错误消息的变量会导致错误 尝试为读取访问锁定变量“User::errMsg”时检测到死锁 下面是非常简单的脚本 public void Main() { try { int x = 2; if

我有一个简单的SSIS包,上面有一个脚本任务。我有一个带有发送邮件任务的OnError事件

我所做的只是测试,看看当我检测到脚本出错时是否可以发送电子邮件。 但是,用于保存电子邮件错误消息的变量会导致错误

尝试为读取访问锁定变量“User::errMsg”时检测到死锁

下面是非常简单的脚本

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在他的文章中解释