1

为相当冗长的标题道歉,但这似乎是描述我遇到的问题的最简短方式。

我正在尝试用 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 变量正在调用环境变量并被正确设置,并且在 Visual Studio 中可见。
4

2 回答 2

1

你可能在这里混淆了一些事情。您有添加变量的代码,然后您正在应用配置,然后您正在尝试添加另一个变量。现在忽略配置步骤,您应该在 Template 命名空间中将一个名为 OutputFolder 的变量添加到您的包中。问题是您试图将此变量的值分配为“与 \Output\ 连接的 FolderRoot 的值”,这将在执行代码时进行评估,从而导致您看到的结果为 \Output\

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

在此处输入图像描述

要使用 BIDS 实现这一点,您需要将该表达式分配给 Expression 属性并将EvaluateAsExpression 翻转为 True。在代码中,那是

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

在我的博客文章中使用 SSIS EzAPI 进行变量和表达式的更多编码示例

于 2012-08-06T20:41:37.977 回答
0

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

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

请将您的答案信用应用于 billinkc 的答案。

于 2012-08-07T03:05:04.850 回答