В компоненте сценариев служб SSIS чем отличается ProcessInput() от Input0_ProcessInputRow()

Я всегда предполагал, что метод Input0_ProcessInputRow(Input0Buffer Row) выполняется один раз для каждой строки, проходящей через компонент сценария:

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    //Code in here runs once for each row coming in to the Script Component
}

Недавно я обнаружил другой метод с именем ProcessInput(int inputID, буфер PipelineBuffer), и мне интересно, если я делаю что-то неправильно, никогда не используя его.

В каких сценариях я бы использовал Input0_ProcessInputRow() против ProcessInput()?

Благодарю.

1 ответ

Решение

После некоторых исследований выясняется, что использование метода _ProcessInputRow() является правильным способом обработки входных данных в компоненте сценариев SSIS.

В своем исследовании я обнаружил, что _ProcessInput () можно использовать для ручной итерации по буферу и отправки результатов в _ProcessInputRow() (однако это не обязательно делать, если у вас нет причин для этого):

public override void  Input0_ProcessInput(Input0Buffer Buffer)
{
    while (Buffer.NextRow())
    {
        Input0_ProcessInputRow(Buffer);
    }
}

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    //Process one row's worth of data by calling "Row."
}

Кроме того, я обнаружил, что метод ProcessInput используется еще дальше от _ProcessInput и _ProcessinputRow (). ProcessInput () - это метод, который позволяет вам манипулировать необработанными буферными данными, поступающими в качестве входных данных:

public override void ProcessInput(int InputID, Microsoft.SqlServer.Dts.Pipeline.PipelineBuffer buffer)
{
    IDTSInput100 input = ComponentMetaData.InputCollection.GetObjectByID(InputID);

    while (buffer.NextRow())
    {
        for (int columnIndex = 0; columnIndex < input.InputColumnCollection.Count; columnIndex++)
        {
            IDTSInputColumn100 inputColumn = input.InputColumnCollection[columnIndex];
            var test = buffer[columnIndex];
        }
    }
}

Я не уверен, почему было бы необходимо использовать ProcessInput (), но приятно знать, что он доступен. Чтобы ответить на мой вопрос, _ProcessInputRow() является правильным методом для обработки данных, поступающих через вход.

Другие вопросы по тегам