编写自定义 Foreach 枚举器代码
适用于:Azure 数据工厂中的 SQL Server SSIS Integration Runtime
创建继承自 ForEachEnumerator 基类的类并将 DtsForEachEnumeratorAttribute 属性应用于该类后,必须重写基类的属性和方法的实现以提供自定义功能。
若要查看自定义枚举器的工作示例,请参阅为自定义 ForEach 枚举器开发用户界面。
初始化枚举器
可以重写 InitializeForEachEnumerator 方法以缓存对包中定义的连接管理器的引用,和缓存对事件接口(用于引发错误、警告和信息性消息)的引用。
验证枚举器
重写 Validate 方法以验证枚举器是否正确配置。 如果该方法返回“Failure”,则枚举器和包含枚举器的包将不执行。 此方法的实现是特定于每个枚举器的,但如果枚举器依赖于 Variable 或 ConnectionManager 对象,则应该添加代码以验证这些对象存在于提供给方法的集合中。
下面的代码示例演示 Validate 的实现,该接口用于检查在枚举器的属性中指定的变量。
private string variableNameValue;
public string VariableName
{
get{ return this.variableNameValue; }
set{ this.variableNameValue = value; }
}
public override DTSExecResult Validate(Connections connections, VariableDispenser variableDispenser, IDTSInfoEvents infoEvents, IDTSLogging log)
{
if (!variableDispenser.Contains(this.variableNameValue))
{
infoEvents.FireError(0, "MyEnumerator", "The Variable " + this.variableNameValue + " does not exist in the collection.", "", 0);
return DTSExecResult.Failure;
}
return DTSExecResult.Success;
}
Private variableNameValue As String
Public Property VariableName() As String
Get
Return Me.variableNameValue
End Get
Set (ByVal Value As String)
Me.variableNameValue = value
End Set
End Property
Public Overrides Function Validate(ByVal connections As Connections, ByVal variableDispenser As VariableDispenser, ByVal infoEvents As IDTSInfoEvents, ByVal log As IDTSLogging) As DTSExecResult
If Not variableDispenser.Contains(Me.variableNameValue) Then
infoEvents.FireError(0, "MyEnumerator", "The Variable " + Me.variableNameValue + " does not exist in the collection.", "", 0)
Return DTSExecResult.Failure
End If
Return DTSExecResult.Success
End Function
返回集合
在执行期间,ForEachLoop 容器调用自定义枚举器的 GetEnumerator 方法。 在此方法中,枚举器创建并填充它的项集合,然后返回该集合。 然后 ForEachLoop 遍历集合中的所有项,并为集合中的每个项执行控制流。
下面的示例演示返回随机整数数组的 GetEnumerator 的实现。
public override object GetEnumerator()
{
ArrayList numbers = new ArrayList();
Random randomNumber = new Random(DateTime.Now);
for( int x=0; x < 100; x++ )
numbers.Add( randomNumber.Next());
return numbers;
}
Public Overrides Function GetEnumerator() As Object
Dim numbers As ArrayList = New ArrayList()
Dim randomNumber As Random = New Random(DateTime.Now)
Dim x As Integer
For x = 0 To 100- 1 Step x + 1
numbers.Add(randomNumber.Next())
Next
Return numbers
End Function