从 foreach 循环内部写入 SSIS 变量
Writing to a SSIS variable from inside a foreach loop
我在 foreach 循环中有一个脚本任务应该写入一个变量。
Dts.Variables["Variable"].Value = "Hello";
对我来说看起来不错,但是变量似乎从未被写入。变量名拼写正确,在脚本任务配置中设置为ReadWrite。
该变量具有包作用域,是否有与它在循环中相关的东西会影响它?我也试过使用 Dts.VariableDispencer.
更新:
我有一个 int,我也写了它确实写得很好。除了数据类型不同外,方法是相同的。知道为什么我写不出字符串吗?
使用此 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();
}
}
事实证明变量实际上被设置为一个表达式(完全忘记我已经这样做了!)。这就是阻止它被覆盖的原因。将其更改为普通变量解决了问题。
我在 foreach 循环中有一个脚本任务应该写入一个变量。
Dts.Variables["Variable"].Value = "Hello";
对我来说看起来不错,但是变量似乎从未被写入。变量名拼写正确,在脚本任务配置中设置为ReadWrite。
该变量具有包作用域,是否有与它在循环中相关的东西会影响它?我也试过使用 Dts.VariableDispencer.
更新: 我有一个 int,我也写了它确实写得很好。除了数据类型不同外,方法是相同的。知道为什么我写不出字符串吗?
使用此 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();
}
}
事实证明变量实际上被设置为一个表达式(完全忘记我已经这样做了!)。这就是阻止它被覆盖的原因。将其更改为普通变量解决了问题。