【问题标题】:Unlock Variable in SSIS [duplicate]SSIS中的解锁变量[重复]
【发布时间】:2015-03-03 13:48:52
【问题描述】:

我已经问过这个问题,我以为我找到了解决方案,但我又被困住了。我遇到了解锁变量的问题。

我正在运行一个 SQL Server 代理作业,它有一个带有 Microsoft Visual C# 2008 的脚本任务,如下所示。我没有在脚本任务编辑器读/写变量列表中列出变量。在我的 SSIS 包中,我有 For Loop Container,它循环这个脚本任务,直到文件确实存在。

https://mitchellsql.wordpress.com/2014/09/06/ssis-script-taskdoes-file-exists/

  public void Main()
    {

        // Lock variables
        Dts.VariableDispenser.LockForRead("User::FolderPath");
        Dts.VariableDispenser.LockForWrite("User::FileExistsFlg");

        // Create a variables 'container' to store variables
        Variables vars = null;

        // Add variables from the VariableDispenser to the variables 'container'
        Dts.VariableDispenser.GetVariables(ref vars);

        string filepath;
        filepath = vars["User::FolderPath"].Value.ToString();
        vars["User::FileExistsFlg"].Value = File.Exists(filepath);

        // Release the locks
        vars.Unlock();

        Dts.TaskResult = (int)ScriptResults.Success;      
    }
  }
}

错误

当 SQL 作业失败但包在通过 Visual Studio 运行时完美运行时出现此错误:

留言

以用户身份执行:PSFACAMDWHSQL1\SYSTEM。微软 (R) SQL Server 为 64 位执行包实用程序版本 10.50.4270.0 版权所有 (C) Microsoft Corporation 2010。保留所有权利。开始: 12:26:43 错误:2015-03-03 12:41:25.79 代码:0xC001404F
来源:For 循环容器描述:此变量集合 已经解锁。 Unlock 方法只在一次 分发变量集合。结束错误 DTExec:包 执行返回 DTSER_FAILURE (1)。开始时间:12:26:43 结束时间: 12:41:25 经过:881.921 秒。包执行失败。 步骤失败。

我将不胜感激。

【问题讨论】:

  • 请确保您不会对变量范围感到困惑。您可以在不同的范围内拥有两个同名的变量,这会使事情变得混乱
  • @Nick 抱歉,我不确定我是否完全理解。
  • 在本例中,msdn.microsoft.com/en-us/library/… 这两个变量首先是LockForRead 之前 GetVariables 被调用。这与您的代码不同。在拨打GetVariables之前尝试使用LockForWrite
  • @Nick 只有一个变量是 LockforRead,第二个是 LockForWrite,两者都不是 LockforRead。不知道是不是我理解错了。
  • Lockforwhatever...您的代码与我发布的链接中的示例代码不同。该链接在GetVariables 之前进行了另外两个调用,您没有...查看我发布的链接中的代码并将其与您的进行比较。

标签: c# sql-server ssis ssis-2008


【解决方案1】:

您可能在脚本任务编辑器读/写变量列表(“User::FileExistsFlg”)中列出了该变量,然后在您的代码中再次锁定它。它的一个或另一个。当我创建一个示例列出了一个用户变量两次时,我的 SSIS 包挂起 - 我可能没有等待足够长的时间让它出错。 只要我没有列出变量 User::A1:

Dts.VariableDispenser.LockForWrite("User::a1");

        // Create a variables 'container' to store variables
        Variables vars = null;

        // Add variables from the VariableDispenser to the variables 'container'
        Dts.VariableDispenser.GetVariables(ref vars);

        //string filepath;
       // filepath = vars["User::FolderPath"].Value.ToString();
       // vars["User::FileExistsFlg"].Value = File.Exists(filepath);
        vars["User::a1"].Value = 35;
        MessageBox.Show(vars["User::a1"].Value.ToString());
        // Release the locks
        vars.Unlock();

        Dts.TaskResult = (int)ScriptResults.Success;

【讨论】:

  • 我没有在脚本任务编辑器中列出变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 2016-06-30
  • 1970-01-01
相关资源
最近更新 更多