我们。 我正在为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");
}
}
我不知道为什么要被召唤两次。 这是数据流:
Dataflow http://img371.imageshack.us/img371/3001/dataflowprocessinputrb6.png
这是映射窗口: Mapping window http://img78.imageshack.us/img78/3772/mappingprocessinputzs2.png
答案 0 :(得分:3)
这是设计的。 SSIS以块(SSIS术语中的缓冲区)发送数据,以优化内存使用。缓冲区大小有限,因此SSIS不必将所有数据读入内存(否则SSIS将无法处理数TB的数据)。因此,您可以获得多个ProcessInput调用 - 每个缓冲区调用一次ProcessInput。
此外,您将获得一个空缓冲区,并在最后将EndOfRowset标志设置为true。但是不要依赖于此 - 这更像是一个实现细节(记录的最后一个缓冲区有EndOfRowset = true,但它没有记录为空)。