2009-01-12 43 views
1

H guys。 我正在爲SSIS開發一個自定義組件。處理輸入時出現問題。 問題在於「ProcessInput」方法不止一次執行。在這種情況下兩次。SSIS - PipelineComponent中的ProcessInput被多次調用

這是這個過程的輸入片段:

public override void ProcessInput(int inputID, PipelineBuffer buffer) 
{ 
    IDTSInput90 input = ComponentMetaData.InputCollection.GetObjectByID(inputID); 
    if (input.InputColumnCollection.Count > 0) 
    { 
     while (buffer.NextRow()) 
     { 
      try 
      { 
       for (int columnIndex = 0; columnIndex < input.InputColumnCollection.Count; columnIndex++) 
       { 

        ColumnInfo columnInfo = _columnInfos[input.InputColumnCollection[columnIndex].ID]; 
        IDTSInputColumn90 inputColumn = input.InputColumnCollection[columnIndex]; 
        try 
        { 
         //write to destination 
        } 
        catch (Exception writeEx) 
        { 
         throw new Exception("Couldn't write to destination"); 
        } 
       } 
      } 
      catch (Exception ex) 
      { 
       throw ex; 
      } 
     } 
    } 
    else 
    { 
     throw new Exception("There is no columns in the input collection"); 
    } 

} 

我不知道爲什麼它被稱爲兩次。 這是數據流:

Dataflow http://img371.imageshack.us/img371/3001/dataflowprocessinputrb6.png

這是映射窗口: Mapping window http://img78.imageshack.us/img78/3772/mappingprocessinputzs2.png

回答

3

這是由設計。 SSIS以塊(SSIS術語中的緩衝區)發送數據,以優化內存使用。緩衝區的大小是有限的,所以SSIS不必讀取所有數據到內存中(否則SSIS將無法處理太字節的數據)。因此,您可以獲得多個ProcessInput調用 - 每個緩衝區一個ProcessInput調用。

另外,你會得到一個空的緩衝區,EndOfRowset標誌在最後設置爲true。但不要依賴於此 - 這更多的是實現細節(最後一個緩衝區記錄爲EndOfRowset = true,但未記錄爲空)。