从SSIS的ScriptTask调用电子邮件OnError

时间:2013-05-03 02:25:01

标签: ssis sendmail onerror

我有一个简单的SSIS包,上面有一个脚本任务。我有一个带有Send Mail任务的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;
            }

如果我的脚本任务发生错误,如何将消息传递给我的发送电子邮件?

1 个答案:

答案 0 :(得分:1)

SSIS变量为locked,仅在其Post Execute event中进行关联。在您的情况下,errMsg变量被脚本任务锁定,同时在{{1}中访问变量} On Error event组件创建SendMail情况。在执行阶段其他组件访问变量之前,您需要具体deadlock变量。

试试这个: -

unlock

这将确保在错误发生之前,变量已解锁,并且可以在 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等执行事件中访问。

Todd McDermid在blog

中解释了如何处理这些类型的死锁的更多内容