2017-03-22 9 views
0

私はBIMLを使用してSSIS dtsxを生成しています。 私は、任意の変数の値のすべての変更をログに記録します。 私はいくつかの変数を持ち、すべてRaiseChangeEventをTRUEにしています。 私はOnVariableValueChangedイベントハンドラを、パッケージと、変数が(Count Rowによって)変更されるデータフローに対して設定しました。SSIS OnVariableValueChangedが実行されない

dtsxを実行すると、ハンドラが呼び出されないことがわかります。 私は他のイベントを試してみて、彼らは呼ばれています。 OnVariableValueChangedの処理を妨げているのは何ですか?

すべての変数は0または正の値に設定され、実際に値が変更されることを確実にするために-1の値から開始するようにしました。

+0

私もこの読み:私はパッケージレベルでのハンドラを持ってhttps://munishbansal.wordpress.com/2009/02/04/onvariablevaluechanged-event-handler-in-ssis-package/ を1つはデータフロー上、もう1つは制御フロー内の各SQLスクリプト上にあります。 –

答えて

0

これは私にとってはうまくいくようです。私はRaiseChangedEventをtrueに設定して変数を作成します。私は、Forループのインクリメントをその値にします。 OnVariableValueChangedイベントのパッケージに添付されている値とイベントハンドラを記録するforループ内にスクリプトタスクがあります。そこに私はシーケンスコンテナとスクリプトタスク(無効)があります。コンテナにブレークポイントを置くと、呼び出されていることがわかります。コントロール・フローと同じコードであるにもかかわらず、スクリプト・タスクを有効にすると、変数をロックするためのタイムアウト・エラーが発生します。 /肩をすくめる

<!-- http://stackoverflow.com/q/42945383/181965 --> 
<Biml xmlns="http://schemas.varigence.com/biml.xsd"> 
    <Packages> 
     <Package Name="so_42945383" > 
      <Variables> 
       <Variable DataType="Int32" Name="IndexCurrent" RaiseChangedEvent="true">-1</Variable> 
       <Variable DataType="Int32" Name="IndexStart">0</Variable> 
       <Variable DataType="Int32" Name="IndexStop">1</Variable> 
      </Variables> 
      <Tasks> 
       <ForLoop Name="FLT Modify values" ConstraintMode="Linear"> 
        <InitializerExpression><![CDATA[@[User::IndexCurrent] = @[User::IndexStart]]]></InitializerExpression> 
        <LoopTestExpression><![CDATA[@[User::IndexCurrent] <= @[User::IndexStop]]]></LoopTestExpression> 
        <CountingExpression><![CDATA[@[User::IndexCurrent] = @[User::IndexCurrent] + 1]]></CountingExpression> 
        <Tasks> 
         <Container Name="SEQC Do nothing" /> 
         <Script ProjectCoreName="FLT_ST_EchoBack" Name="SCR Echo Back FLT"> 
          <ScriptTaskProjectReference ScriptTaskProjectName="ST_EchoBack" /> 
         </Script> 
        </Tasks> 
       </ForLoop> 
      </Tasks> 
      <Events> 
       <Event Name="OVVC" EventType="OnVariableValueChanged"> 
        <Tasks> 
         <Container Name="SEQC Do nothing" /> 
         <Script ProjectCoreName="OVCC_ST_EchoBack" Name="SCR Echo Back OVVC" Disabled="true"> 
          <ScriptTaskProjectReference ScriptTaskProjectName="ST_EchoBack" /> 
         </Script> 
        </Tasks> 
       </Event> 
      </Events> 
     </Package> 
    </Packages> 
<ScriptProjects> 
     <ScriptTaskProject ProjectCoreName="ST_EchoBack" Name="ST_EchoBack" VstaMajorVersion="0"> 
      <ReadOnlyVariables> 
       <!-- List all the variables you are interested in tracking --> 
       <Variable Namespace="User" VariableName="IndexCurrent" DataType="Int32" /> 
       <Variable Namespace="User" VariableName="IndexStart" DataType="Int32" /> 
       <Variable Namespace="User" VariableName="IndexStop" DataType="Int32" /> 
      </ReadOnlyVariables> 
      <Files> 
       <File Path="ScriptMain.cs" BuildAction="Compile">using System; 
using System.Data; 
using Microsoft.SqlServer.Dts.Runtime; 
using System.Windows.Forms; 

namespace ST_EchoBack 
{ 
    [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute] 
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase 
    { 
     public void Main() 
     { 
      bool fireAgain = false; 
      string message = "{0}::{1} : {2}"; 
      foreach (var item in Dts.Variables) 
      { 
       Dts.Events.FireInformation(0, "SCR Echo Back", string.Format(message, item.Namespace, item.Name, item.Value), string.Empty, 0, ref fireAgain); 
      } 

      Dts.TaskResult = (int)ScriptResults.Success; 
     } 

     enum ScriptResults 
     { 
      Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success, 
      Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure 
     }; 
    } 
}    </File> 
       <File Path="Properties\AssemblyInfo.cs" BuildAction="Compile"> 
using System.Reflection; 
using System.Runtime.CompilerServices; 

[assembly: AssemblyVersion("1.0.*")] 
       </File> 
      </Files> 
      <AssemblyReferences> 
       <AssemblyReference AssemblyPath="System" /> 
       <AssemblyReference AssemblyPath="System.Data" /> 
       <AssemblyReference AssemblyPath="System.Windows.Forms" /> 
       <AssemblyReference AssemblyPath="System.Xml" /> 
       <AssemblyReference AssemblyPath="Microsoft.SqlServer.ManagedDTS.dll" /> 
       <AssemblyReference AssemblyPath="Microsoft.SqlServer.ScriptTask.dll" /> 
      </AssemblyReferences> 
     </ScriptTaskProject> 
    </ScriptProjects> 
</Biml> 
関連する問題