0

単一のスクリプト タスクを含む単純な 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;
            }

スクリプト タスクでエラーが発生したときに、送信メールにメッセージを渡すにはどうすればよいですか?

4

1 に答える 1

1

SSIS変数はlocked、その中でのみ解放されますPost 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 Errorこれにより、エラーが発生する前に変数のロックが解除され、やなどの実行イベントでアクセスできるようになりますOnExecStatusChanged

これらのタイプのデッドロックを処理する方法の詳細については、Todd McDermid のブログで説明されています。

于 2013-05-03T05:56:05.893 に答える