none
イベントハンドラ内のスクリプトタスクで変数が参照できない。 RRS feed

  • 全般的な情報交換

  • SSIS 2005を使用して特定の変数が変更された際に、変更後の値で処理をしようとしています。

    イベントハンドラ"OnVariableValueChanged"を作成し、スクリプトタスクを配置し、
    スクリプト内で変数を参照しようとしましたが、以下のエラーが発生しました。

    ---
    エラー: 0xC001405B (スクリプト タスク: 読み取りアクセス用の変数 "User::MsgID" をロックしようとしたときに、
    デッドロックが検出されました。16 回試行しましたがロックを取得できなかったため、ロックはタイムアウトしました。
    ---

    スクリプトプロパティのReadOnlyVariablesに上記の変数名を設定し、
    対象となる変数のプロパティ、RaiseChangedEventをtrueに設定してあります。

    スクリプトは以下の通りです。
    (FireInformationはデバッグのために使用しています。)

    ---
    Public Sub Main()
     Dts.Events.FireInformation(0, "", "XXX " + CStr(Dts.Variables("MsgID").Value) + " XXX", "", 0, True)
     Dts.TaskResult = Dts.Results.Success
    End Sub
    ---

    ちなみに、色々なサイトをみて、VariableDispenserを使用する方法も試してみましたが、
    同じエラーになりました。

    ---
    Public Sub Main()
     Dim var As Variable
     Dim vars As Variables
     Dts.VariableDispenser.LockOneForRead("User::MsgID", vars)
     Dts.Events.FireInformation(0, "", "XXX " + CStr(vars.Count) + " XXX", "", 0, True)
     Dts.TaskResult = Dts.Results.Success
    End Sub
    ---

    以上、何が問題なのか分かりますでしょうか。
    もしくは、イベントハンドラ内のスクリプトタスクで変数は参照出来ないのでしょうか。

    よろしくお願いします。

    2011年3月7日 7:59

すべての返信

  • 自己解決(?)しました。

    まず、デッドロックはイベント発生元になった変数を取得する際に出力されるのであって、
    それ以外の変数は通常の方法で取得できました。

    イベント発生元になった変数を取得するには、
    System::VariableNameとSystem::VariableValueを使用するようです。

    スクリプトプロパティのReadOnlyVariablesに上記変数を記述し、
    以下のスクリプトで取得できました。

    ---
    Public Sub Main()
     If Cstr(Dts.Variables("VariableName").Value) = "MsgID" Then
      Dts.Events.FireInformation(0, "", "XXX " + CStr(Dts.Variables("VariableValue").Value) + " XXX", "", 0, True)
     End If
     Dts.TaskResult = Dts.Results.Success
    End Sub
    ---

    以上、お騒がせしました。

    2011年3月24日 2:23
  • こんにちは、DAIROKU さん。

    MSDN フォーラムのご利用ありがとうございます。
    ご質問の件、自己解決されているようでしたので、ステータスを [質問] から変更させていただきました。
                                                                                     
    日本マイクロソフト株式会社 フォーラム オペレーター 山本 春海

    2011年3月29日 6:04