2009-01-12 4 views
1

H ребята. Я разрабатываю настраиваемый компонент для SSIS. У меня возникают проблемы при обработке входных данных. Проблема заключается в том, что метод «ProcessInput» выполняется несколько раз. Два раза в этом случае.SSIS - ProcessInput в PipelineComponent вызывается более одного раза

Это входной процесс сниппет:

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, но он не документирован как пустой).