次の方法で共有


カスタム 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 列挙子用ユーザー インターフェイスの開発

ヘルプおよび情報

SQL Server 2005 の参考資料の入手