2013-08-10 2 views
2

Нужна помощь ребятам. Недавно я столкнулся с этой проблемой при разработке пакета для моего клиента. Я сохраняю результирующий набор задачи SQl в пользовательской переменной (объекте), а затем пытаюсь получить к ней доступ в различных задачах сценария. Объем переменной установлен на уровень пакета. Когда я использую приведенный ниже код, я могу получить его значение в задании скрипта S.Container, но если я использую тот же код в скриптовой задаче S.Container2, я не могу. в дальнейшем «dt» просто показывает заголовки, а не данные.Невозможно прочитать объектную переменную в ssis

Любая причина такого поведения.? Что мне не хватает?

SQL Task код -----------

select * from dimproduct 

Script код задачи -----------

DataTable dt = new DataTable(); 
DataRow row = null; 
OleDbDataAdapter oleDA = new OleDbDataAdapter(); 
oleDA.Fill(dt, Dts.Variables["Variable"].Value); 
    foreach (DataRow row_ in dt.Rows) 
    { 
     row = row_; 
    } 

enter image description here

EDIT :: Следующий код также не работает.

Variables lockedVariables = null; 
      Dts.VariableDispenser.LockForWrite("User::Variable"); 
      Dts.VariableDispenser.GetVariables(ref lockedVariables); 
      object A; 
      A= lockedVariables["User::Variable"].Value; 
      lockedVariables.Unlock(); 
      DataTable dt = new DataTable(); 
      DataRow row = null; 
      OleDbDataAdapter oleDA = new OleDbDataAdapter(); 
      oleDA.Fill(dt, A); 
      foreach (DataRow row_ in dt.Rows) 
      { 
       row = row_; 

      } 

ответ

0

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

Edit: Calling заполняющая, кажется, очистить результаты источника, так как это должно продемонстрировать:

DataTable dt1 = new DataTable(); 
    OleDbDataAdapter oleDA = new OleDbDataAdapter(); 
    oleDA.Fill(dt1, Dts.Variables["Results"].Value); 
    foreach (DataRow row_ in dt1.Rows) 
    { 
     MessageBox.Show(row_[0].ToString()); 
    } 

    //Try and fill with the same data adapter 
    DataTable dt2 = new DataTable(); 
    oleDA.Fill(dt2, Dts.Variables["Results"].Value); 
    foreach (DataRow row_ in dt2.Rows) 
    { 
     //This will never be hit 
     MessageBox.Show(row_[0].ToString()); 
    } 
+0

Да, я. Это всего лишь одна переменная. Не могли бы вы попробовать сами. – Akshay

+0

@Akshay, OK Я попробовал, я получаю те же результаты, что и вы. Похоже, что вызов Fill опустошает исходный адаптер данных. Я бы присвоил datatable, который вы заполняете, новой переменной объекта? – Meff

+0

1 вещь, я не могу понять, почему только заголовки заполняют, а не данные. Еще одна вещь, которую я попробовал, скопировал задачу выполнения SQL на S.Container2, а затем все закончилось отлично. Это поведение скрипта. – Akshay

0

Существует ошибка сообщили Microsoft об этом ..

https://connect.microsoft.com/SQLServer/feedback/details/265841/ssis-cannot-clone-a-recordset-built-using-the-recordset-destination

Хотя я ЕНВД feel Recordsets - это, как правило, одноразовые коллекции. Когда вы вызываете этот метод Fill, он идет вперед по набору записей и копирует данные в DataTable до тех пор, пока не будет использован набор записей.

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