编写自定义 Foreach 枚举器代码

适用于:Azure 数据工厂中的 SQL Server SSIS Integration Runtime

创建继承自 ForEachEnumerator 基类的类并将 DtsForEachEnumeratorAttribute 属性应用于该类后,必须重写基类的属性和方法的实现以提供自定义功能。

若要查看自定义枚举器的工作示例,请参阅为自定义 ForEach 枚举器开发用户界面

初始化枚举器

可以重写 InitializeForEachEnumerator 方法以缓存对包中定义的连接管理器的引用,和缓存对事件接口(用于引发错误、警告和信息性消息)的引用。

验证枚举器

重写 Validate 方法以验证枚举器是否正确配置。 如果该方法返回“Failure”,则枚举器和包含枚举器的包将不执行。 此方法的实现是特定于每个枚举器的,但如果枚举器依赖于 VariableConnectionManager 对象,则应该添加代码以验证这些对象存在于提供给方法的集合中。

下面的代码示例演示 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  

另请参阅

创建自定义 Foreach 枚举器
为自定义 ForEach 枚举器开发用户界面