查找SSIS脚本组件中的最后一行

时间:2011-03-08 05:00:45

标签: ssis

我有一个SSIS 2008脚本组件,它使用方法

  

Input0_ProcessInputRow(Input0Buffer   行)

处理行。有没有办法找到我正在阅读的行是否是数据集中的最后一行。

5 个答案:

答案 0 :(得分:8)

if (Row.EndOfRowset()) { // this is the last row }

答案 1 :(得分:2)

重写InputRows_ProcessInput的解决方案对我有用。但是,不要使用该代码。方法的名称取决于您的输入的名称。在我的例子中,方法签名是:

public override void Input0_ProcessInput(Input0Buffer Buffer)

找出正确方法的简单方法是进入脚本并输入" base.Input " intellisense应该为您提供正确的覆盖方法。

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

        if (Buffer.EndOfRowset()) 
        {
            //do something 
        }
    }

只需检查" Buffer.EndOfRowset()"是不够的,它不在内部工作"而(Buffer.NextRow())"环。所以我想" EndOfRowset"发生在最后一行之后。

答案 2 :(得分:1)

我之前没有尝试过这个,但是在你的脚本组件之前,添加一个RowCount任务并在此任务中设置一个变量的值(在这里称为RowCnt,初始化为0)。然后在你的脚本中,有这样的东西(确保变量声明在类中作用域)...

Public Class ScriptMain
Inherits UserComponent

Dim iRows As Integer

Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
    iRows = iRows + 1
    If iRows = Variables.RowCnt Then
        'Do something here
    End If
End Sub

End Class

这应该允许你处理最后一行。

答案 3 :(得分:1)

重写InputRows_ProcessInput方法,如下所示:

public override void InputRows_ProcessInput(InputRowsBuffer Buffer)
    {

        while (Buffer.NextRow())
        {
            InputRows_ProcessInputRow(Buffer);
        }

        if (Buffer.EndOfRowset()) 
        {
            //do something 
        }

    }

答案 4 :(得分:0)

自定义脚本代码编写在ScriptMain类内部。此类从UserComponent继承,后者包含一个虚拟方法FinishOutputs()。您可以在ScriptMain中重写此代码,以执行需要在最后一行之后运行的代码。

UserComponent中的相关代码。

public override void ProcessInput(int InputID, string InputName, PipelineBuffer Buffer, OutputNameMap OutputMap)
{

    if (InputName.Equals(@"Input 0", StringComparison.Ordinal))
    {
        Input0_ProcessInput(new Input0Buffer(Buffer, GetColumnIndexes(InputID), OutputMap));
    }

    if (Buffer.EndOfRowset)
    {
        InputsFinished = InputsFinished + 1;
        if (InputsFinished == 1)
        {
            FinishOutputs();
            MarkOutputsFinished();
        }
    }

}

public virtual void FinishOutputs()
{
}

请注意,此代码是自动生成的,无法更改。但是,它确实为您提供了放置代码的位置,因为您可以像这样在ScriptMain中的代码中覆盖FinishOutputs():

public override void FinishOutputs()
{
   //do stuff
}