Compartir a través de


Codificar un enumerador foreach personalizado

Se aplica a: SQL Server SSIS Integration Runtime en Azure Data Factory

Una vez que haya creado una clase que herede de la clase base ForEachEnumerator y haya aplicado el atributo DtsForEachEnumeratorAttribute a la clase, debe invalidar la implementación de las propiedades y los métodos de la clase base para proporcionar su funcionalidad personalizada.

Para obtener un ejemplo funcional de un enumerador personalizado, consulte Developing a User Interface for a Custom ForEach Enumerator (Desarrollar una interfaz de usuario para un enumerador Para cada uno personalizado).

Inicializar el enumerador

Puede invalidar el método InitializeForEachEnumerator para almacenar en memoria caché las referencias a los administradores de conexión definidos en el paquete y las referencias a la interfaz de eventos que puede utilizar para provocar errores, advertencias y mensajes informativos.

Validar el enumerador

Invalide el método Validate para comprobar que el enumerador se ha configurado correctamente. Si el método devuelve error, no se ejecutarán el enumerador ni el paquete que contiene el enumerador. La implementación de este método es específica de cada enumerador, pero si el enumerador se basa en los objetos Variable o ConnectionManager, debe agregar código para comprobar que estos objetos existen en las colecciones que se proporcionan al método.

En el ejemplo de código siguiente se muestra una implementación de Validate que comprueba una variable especificada en una propiedad del enumerador.

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  

Devolver la colección

Durante la ejecución, el contenedor ForEachLoop llama al método GetEnumerator del enumerador personalizado. En este método, el enumerador crea y rellena su colección de elementos y, a continuación, devuelve la colección. A continuación, ForEachLoop itera los elementos de la colección y ejecuta su flujo de control para cada elemento de la colección.

En el ejemplo siguiente se muestra una implementación de GetEnumerator que devuelve una matriz de enteros aleatorios.

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  

Consulte también

Crear un enumerador foreach personalizado
Desarrollar una interfaz de usuario para un enumerador foreach personalizado