カスタム Foreach 列挙子のコーディング
ForEachEnumerator 基本クラスを継承するクラスを作成し、DtsForEachEnumeratorAttribute 属性をそのクラスに適用したら、基本クラスのプロパティとメソッドの実装をオーバーライドして、カスタム機能を提供する必要があります。
カスタム列挙子の実際のサンプルについては、「ForEachDirectory サンプル」を参照してください。
列挙子の実装
列挙子の初期化
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 rand = new Random(DateTime.Now);
for( int x=0; x < 100; x++ )
numbers.Add( rand.Next());
return numbers;
}
Public Overrides Function GetEnumerator() As Object
Dim numbers As ArrayList = New ArrayList()
Dim rand As Random = New Random(DateTime.Now)
Dim x As Integer
For x = 0 To 100- 1 Step x + 1
numbers.Add(rand.Next())
Next
Return numbers
End Function
参照
処理手順
カスタム Foreach 列挙子の作成
カスタム ForEach 列挙子用ユーザー インターフェイスの開発