C# SSIS-PipelineComponent中的ProcessInput被多次调用

C# SSIS-PipelineComponent中的ProcessInput被多次调用,c#,ssis,pipeline,C#,Ssis,Pipeline,伙计们。 我正在为SSIS开发一个自定义组件。我在处理输入时遇到问题。 问题是“ProcessInput”方法执行了多次。在这种情况下是两次 这是流程输入片段: public override void ProcessInput(int inputID, PipelineBuffer buffer) { IDTSInput90 input = ComponentMetaData.InputCollection.GetObjectByID(inputID); if (input.I

伙计们。 我正在为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");
    }

}
public覆盖void ProcessInput(int-inputID,PipelineBuffer)
{
IDTSInput90输入=ComponentMetaData.InputCollection.GetObjectByID(inputID);
如果(input.InputColumnCollection.Count>0)
{
while(buffer.NextRow())
{
尝试
{
对于(int columnIndex=0;columnIndex
我不知道为什么要叫两次。 这是数据流:

这是映射窗口:
这是设计的。SSIS以块(SSIS术语中的缓冲区)的形式发送数据,以优化内存使用。缓冲区大小是有限的,因此SSI不必将所有数据读入内存(否则SSI将无法处理TB的数据)。因此,您可以获得多个ProcessInput调用—每个缓冲区一个ProcessInput调用


此外,您将得到一个空缓冲区,其EndOfRowset标志在最后设置为true。但不要依赖于此-这更像是一个实现细节(最后一个缓冲区记录为EndOfRowset=true,但没有记录为空)。

是否设计为在前一个调用返回之前完成最后一个带有空缓冲区的调用?在我的例子中,我尝试使用ProcessInput进行异步工作,这给我带来了一些麻烦,我觉得SSIS没有正确地等待上一个调用完成……我不希望发生这种情况。检查前一个调用是否真的没有返回-在执行异步工作时很容易意外地提前返回(即,当异步工作仍在进行时,调用将返回)。或者在这里问新问题。