SSIS脚本组件忘记了我的变量

时间:2014-12-15 07:36:34

标签: c# ssis

我有一个包含转换脚本组件的SSIS包。它加载大约460行,然后它停止再次执行脚本组件(我不知道它为什么这样做),它再次创建我的C#类变量和"忘记"它是第一次运行的地方"弹出varibles的空值。

无论如何,在460行之后,脚本组件是否再次运行?我要拉的批次是10000,所以不能这样。

最奇怪的是,经过3次运行包裹(没有改变任何东西),它做的一切都是正确的......

public class ScriptMain : UserComponent
{
    string MarkToRem;
    string TypeToRem;
    string SerToRem;
    int IDCnt;

    public override void PreExecute()
    {

        base.PreExecute();

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


    }


    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {

        MyOutputBuffer.AddRow();
          if(Row.IncomingPrice == "Mark")
          {
            MarkToRem = Row.IncomingCode ; // Setting ver to remember the mark we are in
            MyOutputBuffer.ID = Row.IncomingID.ToString();
            MyOutputBuffer.Mark = MarkToRem;
            MyOutputBuffer.Type = "";
            MyOutputBuffer.Series = "";
            MyOutputBuffer.Code = "";
            MyOutputBuffer.Price = "";
            MyOutputBuffer.Description = "Mark Verander";


          }
          else if( Row.IncomingPrice == "Sub")
          {
             TypeToRem = Row.IncomingCode; // Save our current Type
             SerToRem = Row.IncomingCode; //Save our current Series
             // ============ Output ========================
             MyOutputBuffer.ID = Row.IncomingID.ToString();
             MyOutputBuffer.Mark = MarkToRem;
             MyOutputBuffer.Type = "";
             MyOutputBuffer.Series = "";
             MyOutputBuffer.Code = "";
             MyOutputBuffer.Price = "";
             MyOutputBuffer.Description = "Sub en series verander";

          }
          else if (Row.IncomingPrice == "Series")
          {

              SerToRem = Row.IncomingCode; //Save our current Series
              // ============ Output ========================
              MyOutputBuffer.ID = Row.IncomingID.ToString();
              MyOutputBuffer.Mark = MarkToRem;
              MyOutputBuffer.Type = "";
              MyOutputBuffer.Series = SerToRem;
              MyOutputBuffer.Code = "";
              MyOutputBuffer.Price = "";
              MyOutputBuffer.Description = "Series verander";

          }

          else 
          {
              MyOutputBuffer.ID = Row.IncomingID.ToString();
              MyOutputBuffer.Mark = MarkToRem;
              MyOutputBuffer.Type = TypeToRem;
              MyOutputBuffer.Series =SerToRem;
              MyOutputBuffer.Code = Row.IncomingCode;
              MyOutputBuffer.Price = Row.IncomingPrice;
              MyOutputBuffer.Description = Row.IncomingDiscription;
          }
          IDCnt = IDCnt + 1;

    }


}

前9行看起来像这样。对于传入数据

ID  Code    Price   Discription
1   184pin DDR  Mark    
2   DDR - Non-ECC   Sub 
3   ME-A1GDV4   388 Adata AD1U400A1G3-R 1Gb ddr-400 ( pc3200 ) , CL3 - 184pin - lifetime warranty
4   ME-C512DV4  199 Corsair Valueselect  VS512MB400 512mb ddr-400 ( pc3200 ) , CL2.5 - 184pin -             lifetime warranty
5   ME-C1GDV4   399 Corsair Valueselect  VS1GB400C3 1Gb ddr-400 ( pc3200 ) , CL3 - 184pin - lifetime warranty
6   240pin DDR2 Mark    
7   DDR2 - Non-ECC  Sub 
8   Adata - lifetime warranty   Series  
9   ME-A2VD26C5 345 Adata AD2U667B2G5 Valuselect , 2Gb ddr2-667 ( pc2-5400 ) , CL5 , 1.8v -     240pin -    lifetime warranty 

1 个答案:

答案 0 :(得分:0)

解决了它。

尽可能避免异步转换

SSIS运行时执行定义序列中除数据流任务之外的每个任务。每当SSIS运行时引擎遇到数据流任务时,它就会将数据流任务的执行移交给数据流管道引擎。

数据流管道引擎将数据流任务的执行分解为一个或多个执行树,并且可以并行执行两个或多个执行树以实现高性能。

同步转换获取记录,处理它并将其传递给序列中的其他转换或目标。记录的处理不依赖于其他传入的行。

异步转换需要为其输出添加缓冲区,而不使用传入的输入缓冲区。它还等待所有传入的行到达进行处理,这就是异步转换执行速度较慢的原因,必须尽可能避免。例如,您可以使用ORDER BY子句从源本身获取排序结果,而不是使用排序转换。