【问题标题】:Can I add rows to Output Buffer in SSIS Script Component in PostExecute?我可以在 PostExecute 的 SSIS 脚本组件中将行添加到输出缓冲区吗?
【发布时间】:2017-06-28 14:56:36
【问题描述】:

我有一个脚本组件,我在其中缓冲所有行,然后进行一些处理,然后我想创建输出行。我尝试访问 PostExecute 中的输出缓冲区对象,但显然这是不可能的?遇到 AddRow() 时出现“未将对象引用设置为对象的实例”错误。有没有办法做到这一点?

 public override void PostExecute()
{
    base.PostExecute();

    //processing

    foreach(ChartValue cv in chartValues)
    {
        Output0Buffer.AddRow();
        Output0Buffer.usedcl = cv.Centerline;
        //etc
    }           
}

【问题讨论】:

  • 是的,您只能访问Input0_ProcessInputRow(Input0Buffer Row) 中的输出行。这似乎是一个问题,但总有办法解决它。我不太明白你要在代码中做什么。
  • 您是处于同步模式(默认)还是将其转换为异步模式?脚本是作为转换还是目标创建的?
  • 这是转换,它处于异步模式。可能有办法解决它,如果我可以添加到 PostExecute 的输出中,那就容易多了。也许如果我事先计算了行数,我想我会在 ProcessInputRow 中知道我在最后一行,然后进行最后的处理。

标签: ssis script-component


【解决方案1】:

答案是否定的,你不能这样做,但简单的解决方案:添加 ProcessInput 函数以使用 ProcessInputRow 函数(已包含的函数)循环遍历每一行并使用 EndOfRowset 知道何时完成,然后你可以做最后的处理代码。

public override void Input0_ProcessInput(Input0Buffer Buffer)
{
    base.Input0_ProcessInput(Buffer);

    try
    {
        //loop through each row
        while (Buffer.NextRow())
        {
             Input0_ProcessInputRow(Buffer);
        }

        //when done collecting all rows, do calculations
        if (Buffer.EndOfRowset())
        {
            CalculateResults();
        }
    }
    catch (Exception e)
    {
       //code here
    }
}

public override void Input0_ProcessInputRow(Input0Buffer Row)
{ 
     //gather each row's values and put into List for processing at the end

【讨论】:

  • 这段代码应该可以工作,但我相信如果你调用base.Input0_ProcessInput(Buffer);,你不需要遍历每一行。在调用基本方法之后,只需 if (Buffer.EndOfRowset()) { CalculateResults(); } 就足够了。此代码也有效,但您的 while 循环永远不会进行任何行处理。
  • 你是说你不认为while循环没有做任何事情吗?它只是跳过它(没有找到下一行)?
  • 是的,没错。因为 Buffer 的内容已经被base.Input0_ProcessInput(Buffer); 完全处理过了,这个基本方法在内部也会为每一行调用Input0_ProcessInputRow,所以很难区分(没有调试)。
【解决方案2】:

感谢凯利的例子。但就像 H B 所说的,base.Input0_ProcessInput() 每行都调用Input0_ProcessInputRow。在我的情况下,Buffer.EndOfRowset() 总是错误的。所以我做了更短的代码:

public override void Input0_ProcessInput(Input0Buffer Buffer)
{
    base.Input0_ProcessInput(Buffer); // operate rows in while loop

     //when done collecting all rows, do calculations
    CalculateResults();
}

【讨论】:

  • 这并不完全正确。 Input0_ProcessInput 可以多次调用,您必须包括对Buffer.EndOfRowset() 的检查。 (对于小型数据集,这会很好)
猜你喜欢
  • 1970-01-01
  • 2021-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
相关资源
最近更新 更多