需要一些帮助的人。我最近在为客户开发包时遇到了这个问题。 我将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_;
}
编辑::以下代码也不起作用。
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 :(得分: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)
微软报告了一个关于它的错误..
虽然我觉得记录集通常是一次性使用的集合。当您调用该Fill方法时,它会向前遍历记录集并将数据复制到DataTable中,直到记录集被使用。