Codage d'un énumérateur Foreach personnalisé
Après avoir créé une classe qui hérite de la classe de base ForEachEnumerator, puis appliqué l'attribut DtsForEachEnumeratorAttribute à cette classe, vous devez substituer l'implémentation des propriétés et des méthodes de la classe de base afin de fournir vos fonctionnalités personnalisées.
Pour obtenir un exemple fonctionnel d'énumérateur personnalisé, consultez les exemples Integration Services sur Codeplex.
Initialisation de l'énumérateur
Vous pouvez substituer la méthode InitializeForEachEnumerator pour mettre en cache des références aux gestionnaires de connexions définis dans le package et des références à l'interface d'événements qui vous permet de déclencher des erreurs, des avertissements et des messages d'information.
Validation de l'énumérateur
Substituez la méthode Validate pour vérifier que l'énumérateur est correctement configuré. Si la méthode retourne Failure, l'énumérateur et le package dans lequel il est contenu ne seront pas exécutés. L'implémentation de cette méthode est propre à chaque énumérateur, mais si l'énumérateur utilise des objets Variable ou ConnectionManager, vous devez ajouter du code pour vérifier que ces objets existent dans les collections fournies à la méthode.
L'exemple de code suivant montre une implémentation de Validate qui recherche une variable spécifiée dans une propriété de l'énumérateur.
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
Retour de la collection
Au moment de l'exécution, le conteneur ForEachLoop appelle la méthode GetEnumerator de l'énumérateur personnalisé. Dans cette méthode, l'énumérateur crée et remplit sa collection d'éléments, puis retourne la collection. Le conteneur ForEachLoop itère ensuite les éléments dans la collection et exécute son flux de contrôle pour chacun d'eux.
L'exemple suivant présente une implémentation de GetEnumerator qui retourne un tableau d'entiers aléatoires.
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
|