为相当冗长的标题道歉,但这似乎是描述我遇到的问题的最简洁方式。
我正在尝试用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\\");
非常感谢任何帮助。提前致谢! 富
编辑:对不起,我意识到我错过了一个重要细节:
答案 0 :(得分:1)
你可能会在这里混淆一些事情。您有代码来添加变量,然后您正在应用配置,然后您尝试添加另一个变量。暂时忽略配置步骤,应在模板名称空间中向名为OutputFolder的包添加变量。问题是您正在尝试将此变量的值分配为“FolderRoot的值与\ Output \”连接。这将在执行代码时进行评估,从而导致您看到的内容为\ Output \
相反,您要做的是将变量OutputFolder的值设置为您要分配的 Expression 。直到你看房产才会有点混乱。
要使用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\\";
上有更多编码示例
答案 1 :(得分:0)
使用billinkc提供的方法和链接,我能够让BIDS使用以下代码成功生成变量值:
Variable v = null;
v = pkg.Variables.Add("OutputFolder", false, "Template", String.Empty);
v.EvaluateAsExpression = true;
v.Expression = "@[Template::FolderRoot] + \"\\\\Output\\\\\"";
请将您的回答信用于billinkc的回答。