2014-12-03 2 views
0

Я пытаюсь создать объектную переменную, которая будет содержать коллекцию из Выполнение SQL-задачи. Этот сборник будет использоваться во множестве Задача сценария по всему пакету ETL.SSIS - переменная объекта, преобразованная в DataTable, пуста

Проблема заключается в том, после первого Fill первого Script Task, переменная объект становится пустым. Вот код того, как я использовал переменную к DataTable:

try 
      { 
       DataTable dt = new DataTable(); 

       OleDbDataAdapter da = new OleDbDataAdapter(); 

       da.Fill(dt, Dts.Variables["reportMetrics"].Value); 

       Dts.TaskResult = (int)ScriptResults.Success; 
      } 
      catch (Exception Ex) 
      { 
       MessageBox.Show(Ex.Message); 
       Dts.TaskResult = (int)ScriptResults.Failure; 
      } 

На протяжении всего пакета ETL, Script Task компоненты будут иметь этот кусок кода. Поскольку переменная становится пустой после первого Fill, я не могу повторно использовать объектную переменную.

Я предполагаю, что метод Fill имеет какое-то отношение к этому.

Спасибо!

+0

Заканчивать мой ответ на этот вопрос, он показывает, как повторно использовать переменный объект с ADODB Streams http://stackoverflow.com/questions/25253319/ssis-script-task-reading-recordset -bject-in-loop-is-failing/25256478 # 25256478 –

ответ

0

Похоже, что ваш объект Dts.Variables["reportMetrics"].Value имеет номер DataReader. Этот объект позволяет только доступ к данным только для чтения. Вы не можете дважды заполнить DataTable с помощью DataReader. Для выполнения вашей задачи вам нужно создать еще одну задачу скрипта, которая выполняет именно то, что вы описали здесь: она читает объект Reader до DataTable и сохраняет этот объект DataTable в другом Dts.Variable с объектом типа.

Dts.Variables["reportMetricsTable"].Value = dt

После того, что все ваши задачи subsequequent скрипт должен либо создать копию этой таблицы, если они модифицируют данные, или использовать его непосредственно, если они не изменяют его.

DataTable dtCopy = (Dts.Variables["reportMetricsTable"].Value as DataTable).Copy()

0

У меня была похожая ситуация. Хотя я думаю, что вы можете выполнить задачу SQL с запросом SELECT COUNT (*) и назначить результат для SSIS-переменной, то я сделал, это создать переменную SSIS с именем totalCount с исходным значением 0. Я ожидаю, что общее количество be> 0 (в противном случае мне нечего будет перебирать), поэтому я создал инструкцию if в моей задаче скрипта. Если значение равно нулю, я предполагаю, что totalCount не был инициализирован, поэтому я использую тот же код, который вы используете (с помощью метода Fill). В противном случае (т. Е. В дальнейших итерациях) я пропущу эту часть и продолжаю использовать переменную totalCount. Вот блок кода. Надеюсь, что это помогает:

if ((int)Dts.Variables["User::totalCount"].Value == 0) // if the total count variable has not been initialized... 
     { 
      System.Data.OleDb.OleDbDataAdapter da = new System.Data.OleDb.OleDbDataAdapter(); 
      DataTable stagingTablesQryResult = new DataTable(); 
      da.Fill(stagingTablesQryResult, Dts.Variables["User::stagingTablesQryResultSet"].Value); // to be used for logging how many files are we iterating. It may be more efficient to do a count(*) outside this script and save the total number of rows for the query but I made this as proof of concept for future developments. 

      Dts.Variables["User::totalCount"].Value = stagingTablesQryResult.Rows.Count; 
     } 

Console.WriteLine("{0}. Looking for data file {0} of {1} using search string '{2}'.", counter, Dts.Variables["User::totalCount"].Value, fileNameSearchString); 
+0

Извините, я считаю, что то, что вы ищете, это повторное использование коллекции, а не просто общее количество элементов. Что делать, если вы создаете переменную SSIS типа Object и назначаете ей переменную DataTable в своей задаче скрипта? Я сделал что-то подобное, но это был массив, назначенный объектной переменной SSIS, но я бы подумал, что применяется такая же логика. Удачи! – Marcos

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