0

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

我正在运行一个 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。Microsoft (R) SQL Server Execute Package Utility Version 10.50.4270.0 for 64-bit 版权所有 (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 秒。包执行失败。步骤失败。

我将不胜感激任何帮助。

4

1 回答 1

0

您可能在脚本任务编辑器读/写变量列表(“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;
于 2015-03-03T15:18:46.243 回答