模擬指令碼元件的錯誤輸出
雖然您無法在指令碼元件中將輸出直接設定為錯誤輸出,以自動處理錯誤資料列,不過可以建立其他輸出並使用指令碼中的條件式邏輯,適時地將資料列導向此輸出,以重新產生內建錯誤輸出的功能。 您可能會想要加入兩個額外的輸出資料行,以接收發生錯誤的資料行之錯誤碼與識別碼,來模擬內建錯誤輸出的行為。
如果您需要加入對應至特定預先定義的 Integration Services 錯誤碼之錯誤描述,可以使用 IDTSComponentMetaData100 介面的 GetErrorDescription 方法,這個方法可透過指令碼元件的 ComponentMetaData 屬性取得。
範例
在此所示的範例使用設定成具有兩個同步輸出之轉換的指令碼元件。 指令碼元件的目的在於從 AdventureWorks 範例資料庫的地址資料中,篩選出錯誤資料列。 這個虛構的範例是假設,我們正在為北美的客戶準備促銷活動,並且需要篩選出不在北美的地址。
若要設定範例
在建立新指令碼元件之前,建立連接管理員並設定資料流程來源,以便從 AdventureWorks 範例資料庫選取地址資料。 這個範例只會查看 CountryRegionName 資料行,您可以直接使用 Person.vStateCountryProvinceRegion 檢視,或透過聯結 Person.Address, Person.StateProvince和 Person.CountryRegion 資料表以選取資料。
將新指令碼元件加入資料流程設計師介面,並將它設定為轉換。 開啟 [指令碼轉換編輯器]。
在 [指令碼] 頁面上,將 [ScriptLanguage] 屬性設定成您要用以撰寫指令碼的指令碼語言。
按一下 [編輯指令碼] 開啟 Microsoft Visual Studio Tools for Applications (VSTA)。
在 Input0_ProcessInputRow 方法中,輸入或是貼上以下所示的範例程式碼。
關閉 VSTA。
在 [輸入資料行] 頁面上,選取您要在指令碼轉換中處理的資料行。 這個範例只會使用 CountryRegionName 資料行。 您保留未選取的可用輸入資料行,將會在資料流程中傳遞時保持不變。
在 [輸入及輸出] 頁面上,加入新的第二個輸出,並將其 SynchronousInputID 值設定為輸入的識別碼,這也是預設輸出的 SynchronousInputID 屬性值。 將兩個輸出的 ExclusionGroup 屬性設定為相同的非零值 (例如 1),以指出將每個資料列導向僅兩個輸出的其中一個。 提供特殊的名稱給新錯誤輸出,例如 "MyErrorOutput"。
將額外輸出資料行加入新錯誤輸出,以擷取所需的錯誤資訊,這可能包含發生錯誤的資料行之錯誤碼與識別碼,以及或許還有錯誤描述。 此範例會建立新資料行 ErrorColumn 與 ErrorMessage。 如果您在自己的實作中擷取預先定義的 Integration Services 錯誤,請確定加入錯誤號碼的 ErrorCode 資料行。
請記下指令碼元件將檢查錯誤條件之輸入資料行的識別碼值。 這個範例使用此資料行識別碼以擴展 ErrorColumn 值。
關閉 [指令碼轉換編輯器]。
將指令碼元件的輸出附加至適當的目的地。 一般檔案目的地對於特定測試而言是最容易設定的。
執行封裝。
Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
If Row.CountryRegionName <> "Canada" _
And Row.CountryRegionName <> "United States" Then
Row.ErrorColumn = 68 ' ID of CountryRegionName column
Row.ErrorMessage = "Address is not in North America."
Row.DirectRowToMyErrorOutput()
Else
Row.DirectRowToOutput0()
End If
End Sub
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
if (Row.CountryRegionName!="Canada"&&Row.CountryRegionName!="United States")
{
Row.ErrorColumn = 68; // ID of CountryRegionName column
Row.ErrorMessage = "Address is not in North America.";
Row.DirectRowToMyErrorOutput();
}
else
{
Row.DirectRowToOutput0();
}
}
|