我在foreach循环中有一个脚本任务,应该写入变量。
Dts.Variables["Variable"].Value = "Hello";
对我来说很好看,但变量似乎没有被写入。变量名称拼写正确,并在脚本任务配置中设置为ReadWrite。
变量具有包范围,是否存在与循环中可能影响它的相关内容?我也尝试过使用Dts.VariableDispencer。
更新: 我有一个我也写到的int,它写得很好。除了不同的数据类型,方法是相同的。任何想法,为什么我会写一个字符串?
答案 0 :(得分:1)
使用此tutorial,您可以尝试通过创建两个方法来测试变量:一个用于读取变量,另一个用于写入变量。在尝试访问变量之前,必须先锁定变量。可以把它想象成SSIS的行锁定版本。您希望确保在该时间点获得最准确的变量版本。它有什么用处,因为事情可以并行运行,如果另一个任务是在您尝试读取它的同时更新变量?
public void Main()
{
string myVar = ReadVariable("myVar");
MessageBox.Show(myVar, "myVar");
WriteVariable("Variable", "Hello");
string yourVar = ReadVariable("Variable");
MessageBox.Show(yourVar, "yourVar");
Dts.TaskResult = ScriptResults.Success;
}
private object ReadVariable(string varName)
{
object rtnValue = null;
//Create a variables collection to hold you object
Variables var = default(Variables);
try {
//Lock the variable first to make sure that you have exclusive access
//Think of it like a database object lock
Dts.VariableDispenser.LockOneForRead(varName, var);
//Now populate your result
rtnValue = var(varName).Value;
} catch (Exception ex) {
throw ex;
} finally {
//You must make sure that you unlock the variable before exiting routine
var.Unlock();
}
return rtnValue;
}
private void WriteVariable(string varName, object value)
{
//Create a variables collection to hold you object
Variables var = default(Variables);
try {
//Lock the variable first to make sure that you have exclusive access
//Think of it like a database object lock
Dts.VariableDispenser.LockOneForWrite(varName, var);
//Now populate your result
var(varName).Value = value;
} catch (Exception ex) {
throw ex;
} finally {
//You must make sure that you unlock the variable before exiting routine
var.Unlock();
}
}
答案 1 :(得分:0)
事实证明变量实际上被设置为表达式(完全忘记了我已经完成了!)。这就是阻止它被覆盖的原因。将其更改为正常变量可以解决问题。