撰寫自訂 Foreach 列舉值的程式碼
在您建立從 ForEachEnumerator 基底類別繼承的類別並將 DtsForEachEnumeratorAttribute 屬性 (Attribute) 套用到此類別之後,必須覆寫屬性 (Property) 的實作及基底類別的方法,以提供自訂功能。
如需自訂列舉值的工作範例,請參閱 Codeplex 網站上的 Integration Services 範例 (英文)。
驗證列舉值
您覆寫 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 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
|