2014-12-15 4 views
2

У меня есть пакет SSIS с компонентом сценария преобразования. Он загружает около 460 строк, а затем перестает выполнять компонент скрипта (я не знаю, почему он это делает), ofc снова создает мои переменные класса C# и «забывает», где это был «первый раз, когда он запускался», выбирая нули для варибель.Компонент скрипта SSIS забывает мои переменные

Есть ли способ заставить компонент сценария не запускать его снова после 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 
+0

Добавлен код - примечание, что он создает строку MarkToRem; stringTypeToRem; строка SerToRem; aggain, потому что по какой-то причине он снова выполняет весь компонент скрипта после + - 430 строк. – Jacquespax

+0

. Я собрал пакет воспроизведения и некоторые примеры данных, но я не могу генерировать ошибки во время выполнения. Возможно, я не понимаю эту проблему. Не могли бы вы пояснить, что будет означать сброс переменных? Каковы некоторые из этих данных для IncomingID, IncomingCode и IncomingPrice? Цена, как правило, ограничена Mark, Sub и Series, но может содержать другие значения. – billinkc

+0

Там не будет никаких ошибок, по какой-то причине он начинается с 437 строк, и он начинает составлять компонент скрипта «с нуля», создавая, таким образом, первые верификации, объявленные сверху, и теряет значение там, где оно было. – Jacquespax

ответ

0

Решено.

Избегайте Asynchronous трансформации по мере возможности

SSIS среда выполнение выполняет все задачи, кроме задачи потока данных в определенной последовательности. Всякий раз, когда механизм выполнения SSIS встречает задачу потока данных, он передает выполнение задачи потока данных движению трубопровода потока данных.

Механизм трубопровода потока данных прерывает выполнение задачи потока данных в еще одно дерево выполнения (-ов) и может выполнять два или более исполнительных деревьев параллельно для достижения высокой производительности.

Синхронные преобразования получают запись, обрабатывают ее и передают ее другому преобразованию или назначению в последовательности. Обработка записи не зависит от других входящих строк.

Принимая во внимание, что для асинхронного преобразования необходимы буферы добавления для его вывода и не использует входные входные буферы. Он также ожидает, что все входящие строки поступят для обработки, поэтому асинхронное преобразование выполняется медленнее и его следует избегать, когда это возможно. Например, вместо использования Sort Transformation вы можете получить отсортированные результаты из самого источника с помощью предложения ORDER BY.

Смежные вопросы