【问题标题】:Writing to a SSIS variable from inside a foreach loop从 foreach 循环内部写入 SSIS 变量
【发布时间】:2023-03-19 14:55:01
【问题描述】:

我在 foreach 循环中有一个脚本任务应该写入一个变量。

Dts.Variables["Variable"].Value =  "Hello";

对我来说看起来不错,但是变量似乎从未被写入。变量名拼写正确,在脚本任务配置中设置为ReadWrite。

该变量具有包范围,是否存在与它相关的可能影响它的循环?我也尝试过使用 Dts.VariableDispencer。

更新: 我有一个 int,我也写了一个 int,它确实写得很好。除了不同的数据类型,方法是相同的。任何想法为什么我不能写一个字符串?

【问题讨论】:

  • Looks fine to me, however the variable doesn't ever seem to be written to. - 你是怎么确认的?如果变量具有包范围,则没有理由不写入变量。
  • 变量在循环外恢复为原始值。我有一个电子邮件任务,将变量的内容作为消息正文通过电子邮件发送
  • 你确定这个变量已经被设置了吗?尝试放置多个MessageBox.Show() 函数以查看是否已设置。此外,您可以调试包并在“观察”窗口中循环查看变量的值。
  • 这曾经让我感到困惑 - 确保您没有创建任何与包级别变量同名的组件级别变量。如果存在同名的组件级变量,它们将被写入而不是包级变量(然后在后续步骤中将无法访问!)。

标签: sql-server ssis sql-server-2012 ssis-2012


【解决方案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();
    }

}

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 哈哈.. 发生在我们最好的人身上!
    猜你喜欢
    • 2017-07-21
    • 2016-07-19
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    相关资源
    最近更新 更多