如何在SSIS脚本任务中循环遍历通用对象

我有一个从SQL进程传递到脚本任务的通用对象。 该对象本质上是一个数据表,但为了从sql进程获取完整的结果集,我必须将它存储在一个通用对象中。

所以如果我有:

Object A = Dts.Variables[0]; 

然后,我将如何提取并操纵其值。

基本上我想做的是:

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

但这显然不起作用。

从Object解析数据表没有任何问题。 我见过Andy Leonard在他的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(); 

上面的数据表/ datarow代码是近似的。 重要的一点就是访问SSIS变量所持有的好东西,需要访问该对象的Value。

我无法获得上述任何答案,因此下面列出的是我用来加载数据表的代码。 “User :: transactionalRepDBs”是Object(System.Object)的SSIS变量,它是通过执行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); } 

建议#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; 

太棒了,

这工作得很好..

 DataTable dt= new DataTable(); OleDbDataAdapter adapter = new OleDbDataAdapter(); adapter.Fill(dt, Dts.Variables["User::transactionalRepDBs"].Value); 
  // Works Perfectly fine ....ssis , c# DataTable dt = new DataTable(); OleDbDataAdapter adapter = new OleDbDataAdapter(); adapter.Fill(dt, Dts.Variables["User::VariableObj"].Value); foreach (DataColumn cols in dt.Columns) { MessageBox.Show("Colum Name = " + cols.ToString()); } foreach (DataRow row in dt.Rows) { MessageBox.Show( "rows ID = " + row[0].ToString() + " rows Name = " + row[1].ToString()); }