如 [編寫程式代碼和偵錯腳本元件](.. 中所述。/extending-packages-scripting/data-flow-script-component/coding-and-debug-the-script-component.md,Script 元件專案包含三個專案專案:
專案
ScriptMain,其中包含ScriptMain您撰寫程式代碼的類別。ScriptMain類別繼承自UserComponent類別。ComponentWrapper專案,其中包含UserComponent類別的 實例ScriptComponent,其中包含您將用來處理數據及與封裝互動的方法和屬性。 專案ComponentWrapper也包含Connections和Variables集合類別。專案
BufferWrapper,其中包含繼承自 ScriptBuffer 每個輸入和輸出的類別,以及每個數據行的具型別屬性。
當您在 ScriptMain 專案中撰寫程式代碼時,將會使用本主題所討論的物件、方法和屬性。 並非這裡列出的所有方法都會讓每一個元件使用,但是在使用這些方法時,則會以顯示的順序來使用。
ScriptComponent 基底類別不包含本主題討論之方法的任何實作程式碼。 因此,將基底類別實作的呼叫加入到您自己的方法實作中是不必要的,但是這樣做也無害。
如需如何在特定的指令碼元件類型中使用這些類別的方法和屬性的資訊,請參閱其他指令碼元件範例。 範例主題也包含完整的程式碼範例。
AcquireConnections 方法
來源和目的地通常必須連接到外部資料來源。 覆寫 AcquireConnections 基底類別的 ScriptComponent 方法,從適當的連接管理員擷取連接或連接資訊。
下列範例會 System.Data.SqlClient.SqlConnection 從 ADO.NET 連線管理員傳回 。
Dim connMgr As IDTSConnectionManager100
Dim sqlConn As SqlConnection
Public Overrides Sub AcquireConnections(ByVal Transaction As Object)
connMgr = Me.Connections.MyADONETConnection
sqlConn = CType(connMgr.AcquireConnection(Nothing), SqlConnection)
End Sub
下列範例會從一般檔案 連線管理員 傳回完整的路徑和檔名,然後使用 開啟檔案System.IO.StreamReader。
Private textReader As StreamReader
Public Overrides Sub AcquireConnections(ByVal Transaction As Object)
Dim connMgr As IDTSConnectionManager100 = _
Me.Connections.MyFlatFileSrcConnectionManager
Dim exportedAddressFile As String = _
CType(connMgr.AcquireConnection(Nothing), String)
textReader = New StreamReader(exportedAddressFile)
End Sub
PreExecute 方法
每當您的處理必須只能在您開始處理資料列以前執行一次時,請覆寫 PreExecute 基底類別的 ScriptComponent 方法。 例如在目的地中,您可能會想要設定參數化命令,目的地將會使用該命令將每個資料列插入資料來源中。
Dim sqlConn As SqlConnection
Dim sqlCmd As SqlCommand
Dim sqlParam As SqlParameter
...
Public Overrides Sub PreExecute()
sqlCmd = New SqlCommand("INSERT INTO Person.Address2(AddressID, City) " & _
"VALUES(@addressid, @city)", sqlConn)
sqlParam = New SqlParameter("@addressid", SqlDbType.Int)
sqlCmd.Parameters.Add(sqlParam)
sqlParam = New SqlParameter("@city", SqlDbType.NVarChar, 30)
sqlCmd.Parameters.Add(sqlParam)
End Sub
SqlConnection sqlConn;
SqlCommand sqlCmd;
SqlParameter sqlParam;
public override void PreExecute()
{
sqlCmd = new SqlCommand("INSERT INTO Person.Address2(AddressID, City) " + "VALUES(@addressid, @city)", sqlConn);
sqlParam = new SqlParameter("@addressid", SqlDbType.Int);
sqlCmd.Parameters.Add(sqlParam);
sqlParam = new SqlParameter("@city", SqlDbType.NVarChar, 30);
sqlCmd.Parameters.Add(sqlParam);
}
處理輸入和輸出
處理輸入
設定為轉換或目的地的指令碼元件有一個輸入。
BufferWrapper 專案項目提供的內容
針對您已設定的每個輸入, BufferWrapper 專案專案包含衍生自 ScriptBuffer 的類別,且名稱與輸入相同。 每一個輸入緩衝區類別都包含下列屬性、函數和方法:
每一個選定輸入資料行的具名、具類型存取子屬性。 這些屬性是唯讀或可讀寫,這取決於在 [指令碼轉換編輯器] 的 [輸入資料行] 頁面上針對資料行所指定的 [使用類型] 。
每一個選定輸入資料行的 <column>_IsNull 屬性。 這個屬性也是唯讀或可讀寫,這取決於針對資料行指定的 [使用類型] 而定。
每個已設定輸出的 DirectRowTo<outputbuffer> 方法。 當您將資料列篩選為相同
ExclusionGroup中的數個輸出之一時,您將使用這些方法。要取得下一個
NextRow輸入數據列的函式,以及判斷數據的最後一個EndOfRowset緩衝區是否已處理的函式。 當您使用基類中實作的UserComponent輸入處理方法時,通常不需要這些函式。 下一節提供基類的詳細資訊UserComponent。
ComponentWrapper 專案項目提供的內容
ComponentWrapper 專案專案包含衍生自 UserComponent的類別ScriptComponent。 您 ScriptMain 撰寫自訂程式代碼的類別會接著衍生自 UserComponent。 類別 UserComponent 包含下列方法:
方法的覆寫實作
ProcessInput。 這是數據流引擎在 方法之後PreExecute的運行時間下一次呼叫的方法,而且可能會呼叫多次。ProcessInput將處理 <交給 inputbuffer>_ProcessInput 方法。 然後,ProcessInput方法會檢查輸入緩衝區的結尾,如果到達緩衝區的結尾,則會呼叫可FinishOutputs覆寫的方法和私MarkOutputsAsFinished用方法。 方法MarkOutputsAsFinished接著會在最後一個輸出緩衝區上呼叫SetEndOfRowset。可覆寫的 <inputbuffer>_ProcessInput 方法實作。 這個預設實作只會在每一個輸入資料列中執行迴圈,並呼叫 <inputbuffer>_ProcessInputRow。
可覆寫的 <inputbuffer>_ProcessInputRow 方法實作。 預設的實作是空的。 這是您通常會覆寫,以撰寫自訂資料處理程式碼的方法。
自訂程式碼應該做的事
您可以使用下列方法來處理 類別中的 ScriptMain 輸入:
覆寫 <inputbuffer>_ProcessInputRow,以處理每一個輸入資料列中通過的資料。
只有當您在輸入資料列中執行迴圈時,必須做其他額外動作的時候,才會覆寫 <inputbuffer>_ProcessInput。 (例如,您必須測試
EndOfRowset在處理所有數據列之後採取其他動作。呼叫 <inputbuffer>_ProcessInputRow 以執行數據列處理。如果您需要在輸出關閉之前執行某些動作,請覆寫
FinishOutputs。
方法 ProcessInput 可確保這些方法會在適當的時間呼叫。
處理輸出
設定為來源或轉換的指令碼元件有一個或多個輸出。
BufferWrapper 專案項目提供的內容
如果是您已設定的每一個輸出,BufferWrapper 專案項目都會包含一個衍生自 ScriptBuffer 的類別,而且名稱與輸出相同。 每一個輸入緩衝區類別都包含下列屬性和方法:
每一個輸出資料行的具名、具類型、唯寫的存取子屬性。
唯<>寫數據行_IsNull屬性,可供您用來將數據行值設定為 的每個選取輸出數據
null行。將
AddRow空白的新數據列加入至輸出緩衝區的方法。SetEndOfRowset讓數據流引擎知道預期不會再有數據緩衝區的方法。 還有一個EndOfRowset函式可判斷目前緩衝區是否為數據的最後一個緩衝區。 當您使用基類中實作的UserComponent輸入處理方法時,通常不需要這些函式。
ComponentWrapper 專案項目提供的內容
ComponentWrapper 專案專案包含衍生自 UserComponent的類別ScriptComponent。 您 ScriptMain 撰寫自訂程式代碼的類別會接著衍生自 UserComponent。 類別 UserComponent 包含下列方法:
方法的覆寫實作
PrimeOutput。 數據流引擎會在運行時間之前ProcessInput呼叫這個方法,而且只會呼叫一次。PrimeOutput將處理CreateNewOutputRows交給方法。 然後,如果元件是來源(也就是元件沒有輸入),PrimeOutput則會呼叫可FinishOutputs覆寫的方法和私MarkOutputsAsFinished用方法。 方法MarkOutputsAsFinished會在最後一個輸出緩衝區上呼叫SetEndOfRowset。方法的可覆寫實作
CreateNewOutputRows。 預設的實作是空的。 這是您通常會覆寫,以撰寫自訂資料處理程式碼的方法。
自訂程式碼應該做的事
您可以使用下列方法來處理 類別中的 ScriptMain 輸出:
CreateNewOutputRows只有在您可以在處理輸入資料列之前新增和填入輸出資料列時,才覆寫 。 例如,您可以在來源中使用CreateNewOutputRows,但在具有異步輸出的轉換中,您應該在處理輸入資料期間或之後呼叫AddRow。如果您需要在輸出關閉之前執行某些動作,請覆寫
FinishOutputs。
方法 PrimeOutput 可確保這些方法會在適當的時間呼叫。
PostExecute 方法
每當您的處理必須只能在處理資料列之後執行一次時,請覆寫 PostExecute 基底類別的 ScriptComponent 方法。 例如,在來源中,您可能想要關閉 System.Data.SqlClient.SqlDataReader 用來將資料載入資料流的 。
重要
的集合 ReadWriteVariables 只能在方法中使用 PostExecute 。 因此您無法在處理每一列資料時,直接增量封裝變數值。 相反地,遞增局部變數的值,並在處理所有數據之後,將封裝變數的值設定為方法中 PostExecute 局部變數的值。
ReleaseConnections 方法
來源和目的地通常必須連接到外部資料來源。 覆寫 ReleaseConnections 基底類別的 ScriptComponent 方法,以關閉及釋放您之前在 AcquireConnections 方法中所開啟的連接。
Dim connMgr As IDTSConnectionManager100
...
Public Overrides Sub ReleaseConnections()
connMgr.ReleaseConnection(sqlConn)
End Sub
IDTSConnectionManager100 connMgr;
public override void ReleaseConnections()
{
connMgr.ReleaseConnection(sqlConn);
}
使用 Integration Services 保持最新狀態
如需來自Microsoft的最新下載、文章、範例和影片,以及來自社群的所選解決方案,請流覽 MSDN 上的 Integration Services 頁面:
流覽 MSDN 上的 Integration Services 頁面
如需這些更新的自動通知,請訂閱頁面上可用的 RSS 摘要。
另請參閱
在文稿元件編輯器 中設定腳本元件 [編寫和偵錯腳本元件](.。/extending-packages-scripting/data-flow-script-component/coding-and-debug-the-script-component.md