Как перебрать общий объект в задаче сценария SSIS

У меня есть общий объект, который передается в задачу сценария из процесса SQL. Объект, по сути, будет таблицей данных, но для того, чтобы получить полный набор результатов из процесса sql, я должен сохранить его в универсальном объекте.

Итак, если у меня есть:

Object A = Dts.Variables[0];

Как тогда я буду извлекать, а затем манипулировать его значениями.

В основном, что я хочу сделать, это:

Object A = Dts.Variables[0];
strin x = A.Column[0].value.tostring();

Но это явно не сработает.


person some_bloody_fool    schedule 11.11.2011    source источник


Ответы (5)


Нет ничего плохого в разборе таблицы данных из объекта. Я видел, как Энди Леонард делал это на своих платформах ETL.

Вы были на правильном пути, но не видели всей картины. Этот код присваивает объекту типа Variable (приблизительно) на A. Затем вы пытаетесь получить доступ к несуществующему свойству.

Object A = Dts.Variables[0];

Вам нужно получить значение переменной. Вы можете сделать это как задание для A

Object A = Dts.Variables[0].Value;

Или, если вам нужно сделать что-то еще с фактической переменной, вы должны сохранить текущее назначение кода A, а затем получить доступ к свойству Value.

Object A = Dts.Variables[0];
DataTable B = (DataTable) A.Value;
DataRow C = B.Row[0];
string x = C.Column[0].ToString();

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

person billinkc    schedule 11.11.2011
comment
Downvoter, помогите мне понять, что нужно сделать, чтобы улучшить этот ответ? - person billinkc; 20.08.2013

Я не смог заставить работать ни один из приведенных выше ответов, поэтому ниже приведен код, который я использовал для загрузки таблицы данных. «User::transactionalRepDBs» — это переменная SSIS объекта (System.Object), которая была загружена через «полный набор результатов» из сценария выполнения задачи SQL. В качестве задачи сценария используется C#. Эта ссылка мне помогла.

using System.Data.OleDb;

DataTable dt= new DataTable();
OleDbDataAdapter adapter = new OleDbDataAdapter();
adapter.Fill(dt, Dts.Variables["User::transactionalRepDBs"].Value);
String _showMe;

foreach (DataRow row in dt.Rows)
{
   //insert what you want to do here
           for (int i = 0, _showMe = ""; i < row.ItemArray.Length; i++ )
           {
               _showMe += row.ItemArray[i].ToString() + " | ";
           }

           MessageBox.Show("Data row #" + dt.Rows.IndexOf(row).ToString() + " value: " + _showMe);
}
person Tequila    schedule 31.12.2012

Предложение № 1: доступ к переменным по имени, а не по числовому индексу.

Предложение № 2. Приведите результат свойства Value к ожидаемому типу объекта.

Таким образом:

string myString = (string)Dts.Variables["MyString"].Value;
DataTable myTable = (DataTable)Dts.Variables["MyTable"].Value;
DataTable myOtherTable = Dts.Variables["MyOtherTable"].Value as DataTable;
person Edmund Schweppe    schedule 11.11.2011

крутой мужик,

Это работает отлично..

DataTable dt= new DataTable();
OleDbDataAdapter adapter = new OleDbDataAdapter();
adapter.Fill(dt, Dts.Variables["User::transactionalRepDBs"].Value);
person Aswartha    schedule 15.03.2013

person    schedule
comment
Хотя этот фрагмент кода может решить вопрос, включение объяснения действительно помогает улучшить качество вашего поста. Помните, что вы отвечаете на вопрос для будущих читателей, и эти люди могут не знать причин вашего предложения кода. - person DimaSan; 14.03.2017