无法在ssis中读取对象变量

时间:2013-08-10 16:59:34

标签: ssis

需要一些帮助的人。我最近在为客户开发包时遇到了这个问题。 我将SQl任务的结果集保存在用户变量(对象)中,然后尝试在各种脚本任务中访问它。变量的范围设置为包级别。当我使用下面的代码时,我能够在S.Container的Script任务中检索它的值,但是如果我在S.Container2的Script任务中使用相同的代码,我无法做到。在后面,'dt'只显示标题,而不是数据。

出现这种特殊行为的原因。我错过了什么?

SQL任务代码-----------

select * from dimproduct

脚本任务代码-----------

 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

编辑::以下代码也不起作用。

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_;

            }

2 个答案:

答案 0 :(得分:0)

你确定你没有意外地两次声明变量,一次是使用包的范围,一次是使用第一个序列容器的范围吗?

编辑:调用Fill似乎清除了源结果,因为这应该证明:

    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());
    }   

答案 1 :(得分:0)

微软报告了一个关于它的错误..

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

虽然我觉得记录集通常是一次性使用的集合。当您调用该Fill方法时,它会向前遍历记录集并将数据复制到DataTable中,直到记录集被使用。