2

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

4

1 回答 1

3

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

此外,您将在最后获得一个 EndOfRowset 标志设置为 true 的空缓冲区。但是不要依赖这个——这更多的是一个实现细节(最后一个缓冲区被记录为 EndOfRowset = true,但它没有被记录为空)。

于 2009-01-12T16:32:04.763 回答