C# 如何使用从环境变量配置中设置的变量在SSIS包中设置变量?

C# 如何使用从环境变量配置中设置的变量在SSIS包中设置变量?,c#,ssis,C#,Ssis,很抱歉标题太长,但这似乎是描述我遇到的问题的最简单的方式 我正试图用C语言编写一个程序来生成SSIS包。我确实有可用作模板的现有包,在现有包中,有使用其他变量的变量,这些变量是使用环境变量填充的。例如,有一个名为“RootFolder”的变量,它是使用环境变量设置的,用于为包建立工作文件夹。包中还有另一个名为“OutputFolder”的变量,它接受RootFolder变量的值并附加字符串“\Output”。非常简单,最初的开发人员使用BIDS Helper为OutputFolder设置以下表达

很抱歉标题太长,但这似乎是描述我遇到的问题的最简单的方式

我正试图用C语言编写一个程序来生成SSIS包。我确实有可用作模板的现有包,在现有包中,有使用其他变量的变量,这些变量是使用环境变量填充的。例如,有一个名为“RootFolder”的变量,它是使用环境变量设置的,用于为包建立工作文件夹。包中还有另一个名为“OutputFolder”的变量,它接受RootFolder变量的值并附加字符串“\Output”。非常简单,最初的开发人员使用BIDS Helper为OutputFolder设置以下表达式:@[Template::RootFolder]+“\Output\”

我在C#中构建这个时遇到了一点问题,因为在创建变量之前似乎没有设置环境变量,所以子变量似乎只有附加的数据。使用上面的示例,我的“OutputFolder”变量等于“\OutPut\”

下面是我用来设置配置以指向环境变量的代码片段,并将变量堆叠到RootFolder之外

pkg.Variables.Add("FolderRoot", false, "Template", "");

Configuration configRootFolder = pkg.Configurations.Add();
configRootFolder.Name = @"RootFolder";
configRootFolder.ConfigurationType = Microsoft.SqlServer.Dts.Runtime.DTSConfigurationType.EnvVariable;
configRootFolder.ConfigurationString = @"Ssis_RootFolder";
configRootFolder.PackagePath = "\\Package.Variables[Template::FolderRoot].Properties[Value]";

pkg.Variables.Add("OutputFolder", false, "Template", pkg.Variables["Template::FolderRoot"].Value + "\\Output\\");
如蒙协助,将不胜感激。提前谢谢! 丰富的

编辑:对不起,我意识到我错过了一个重要的细节:

  • 使用该程序创建包后,RootFolder变量将调用环境变量并正确设置,并且在VisualStudio中可见

    • 您可能会把这里的事情弄糊涂。您有代码来添加变量,然后应用配置,然后尝试添加另一个变量。现在忽略配置步骤,您应该在模板名称空间中将一个名为OutputFolder的变量添加到包中。问题在于,您试图将此变量的值指定为“FolderRoot的值与\Output\连接”,执行代码时将对该值进行计算,从而生成您所看到的\Output\

      相反,您要做的是让变量OutputFolder的值成为您正在分配的表达式。在查看属性之前,您可能会感到有些困惑

      要使用BIDS实现这一点,需要将该表达式指定给expression属性,并将flip EvaluateExpression设置为True。在代码中,就是这样

      Variable v = null;
      v = pkg.Variables.Add("OutputFolder", false, "Template", String.Empty);
      v.EvaluateAsExpression = true;
      v.Expression = pkg.Variables["Template::FolderRoot"].Value + "\\Output\\";
      

      在我的博客文章中有更多的编码示例

      您可能会对这里的内容感到困惑。您有代码来添加变量,然后应用配置,然后尝试添加另一个变量。现在忽略配置步骤,您应该在模板名称空间中将一个名为OutputFolder的变量添加到包中。问题在于,您试图将此变量的值指定为“FolderRoot的值与\Output\连接”,执行代码时将对该值进行计算,从而生成您所看到的\Output\

      相反,您要做的是让变量OutputFolder的值成为您正在分配的表达式。在查看属性之前,您可能会感到有些困惑

      要使用BIDS实现这一点,需要将该表达式指定给expression属性,并将flip EvaluateExpression设置为True。在代码中,就是这样

      Variable v = null;
      v = pkg.Variables.Add("OutputFolder", false, "Template", String.Empty);
      v.EvaluateAsExpression = true;
      v.Expression = pkg.Variables["Template::FolderRoot"].Value + "\\Output\\";
      

      在我的博客文章中有更多的编码示例

      使用billinkc提供的方法和链接,我能够使用以下代码成功地让出价生成一个变量值:

      Variable v = null;
      v = pkg.Variables.Add("OutputFolder", false, "Template", String.Empty);
      v.EvaluateAsExpression = true;
      v.Expression = "@[Template::FolderRoot] + \"\\\\Output\\\\\"";
      

      请将您的答案积分应用于billinkc的答案。

      使用billinkc提供的方法和链接,我能够使用以下代码成功地让投标生成变量值:

      Variable v = null;
      v = pkg.Variables.Add("OutputFolder", false, "Template", String.Empty);
      v.EvaluateAsExpression = true;
      v.Expression = "@[Template::FolderRoot] + \"\\\\Output\\\\\"";
      

      请将您的答案计入billinkc的答案。

      非常感谢您的回复!完全有道理,但我无法让你在这里使用的表达式正常工作。它忽略了变量,只将\Output\设置为表达式。不过,我确实看了一下您也附加的链接,并使用了您在该页面上使用的表达式示例,它工作得非常好。再次感谢!非常感谢您的回复!完全有道理,但我无法让你在这里使用的表达式正常工作。它忽略了变量,只将\Output\设置为表达式。不过,我确实看了一下您也附加的链接,并使用了您在该页面上使用的表达式示例,它工作得非常好。再次感谢!