0

我有一个简单的 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;
            }

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

4

1 回答 1

1

SSIS 变量locked仅在其 .InPost Execute event您的情况下errMsg变量被脚本任务锁定,同时该变量被创建情况On Error event的组件访问。您需要在其他组件访问该变量之前专门指定该变量它的执行阶段。SendMaildeadlockunlock

尝试这个 :-

 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 ErrorOnExecStatusChanged

Todd McDermid 在他的博客中解释了有关如何处理这些类型的死锁的更多信息

于 2013-05-03T05:56:05.893 回答