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

}

事实证明变量实际上被设置为一个表达式(完全忘记我已经这样做了!)。这就是阻止它被覆盖的原因。将其更改为普通变量解决了问题。