我有一个SSIS 2008脚本组件,它使用方法
Input0_ProcessInputRow(Input0Buffer 行)
处理行。有没有办法找到我正在阅读的行是否是数据集中的最后一行。
答案 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
}