SSIS - ProcessInput в PipelineComponent вызывается более одного раза - PullRequest
1 голос
/ 12 января 2009

Ч, ребята. Я разрабатываю пользовательский компонент для SSIS. У меня проблема при обработке входных данных. Проблема в том, что метод 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");
    }

}

Понятия не имею, почему его вызывают дважды. Это поток данных:

Поток данных http://img371.imageshack.us/img371/3001/dataflowprocessinputrb6.png

И это окно отображения: Окно картирования http://img78.imageshack.us/img78/3772/mappingprocessinputzs2.png

1 Ответ

3 голосов
/ 12 января 2009

Это по замыслу. Служба SSIS отправляет данные порциями (буферы в терминологии служб SSIS), чтобы оптимизировать использование памяти. Размер буфера ограничен, поэтому SSIS не должен считывать все данные в память (иначе SSIS не сможет обрабатывать терабайты данных). Таким образом, вы можете получить несколько вызовов ProcessInput - один вызов ProcessInput на буфер.

Кроме того, вы получите один пустой буфер с флагом EndOfRowset, установленным в true в самом конце. Но не полагайтесь на это - это больше подробности реализации (последний буфер задокументирован как EndOfRowset = true, но не задокументирован как пустой)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...