SSIS OnVariableValueChanged未激发
我正在使用BIML生成SSIS dtsx。 我希望记录任何变量值的每次更改。 我有几个变量,所有的RaiseChangeEvent都为TRUE。 我为包和数据流设置了一个OnVariableValueChanged事件处理程序,其中变量发生了更改(通过计数行) 当我执行dtsx时,我看到处理程序甚至没有被调用。 我尝试过其他活动,它们被称为。 那么,是什么阻止OnVariableValueChanged被处理呢SSIS OnVariableValueChanged未激发,ssis,event-handling,biml,Ssis,Event Handling,Biml,我正在使用BIML生成SSIS dtsx。 我希望记录任何变量值的每次更改。 我有几个变量,所有的RaiseChangeEvent都为TRUE。 我为包和数据流设置了一个OnVariableValueChanged事件处理程序,其中变量发生了更改(通过计数行) 当我执行dtsx时,我看到处理程序甚至没有被调用。 我尝试过其他活动,它们被称为。 那么,是什么阻止OnVariableValueChanged被处理呢 所有变量都将设置为0或正值,我确保它们以-1值开始,以确保实际值发生变化。这似乎对我
所有变量都将设置为0或正值,我确保它们以-1值开始,以确保实际值发生变化。这似乎对我有效。我创建了一个
RaiseChangedEvent
设置为true的变量。然后我有一个For循环增量,这个值。我在for循环中有一个脚本任务,用于记录值,并在OnVariableValueChanged事件的包中附加了一个事件处理程序。我有一个序列容器和一个脚本任务(已禁用)。如果我在容器上放置一个断点,我可以看到它正在被调用。在那里启用脚本任务,尽管与控制流中的代码相同,但会导致锁定变量的超时错误/耸耸肩
<!-- 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>
-1
0
1.
使用制度;
使用系统数据;
使用Microsoft.SqlServer.Dts.Runtime;
使用System.Windows.Forms;
名称空间ST_EchoBack
{
[Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
公共部分类ScriptMain:Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
公共图书馆
{
bool=false;
字符串消息=“{0}::{1}:{2}”;
foreach(Dts.Variables中的变量项)
{
FireInformation(0,“SCR回显”,string.Format(消息,项.名称空间,项.名称,项.值),string.Empty,0,再次引用FireInformation);
}
Dts.TaskResult=(int)ScriptResults.Success;
}
枚举脚本结果
{
Success=Microsoft.SqlServer.Dts.Runtime.dtsesecresult.Success,
Failure=Microsoft.SqlServer.Dts.Runtime.dtsesecresult.Failure
};
}
}
运用系统反思;
使用System.Runtime.CompilerServices;
[汇编:汇编版本(“1.0.*)]
我也读过这篇文章:我在包级别有一个处理程序,一个在数据流上,另一个在控制流中的每个sql脚本上。