1

我正在尝试在从 C# 启动的 SSIS 包的代码中设置变量。

Package pkg = app.LoadPackage(ConfigurationManager.AppSettings["SsisPkg"].ToString(), null);
pkg.Variables["User::FolderPath"].Value = Path.GetDirectoryName(e.FullPath);
pkg.Variables["User::FileName"].Value = Path.GetFileNameWithoutExtension(e.FullPath);

在调试时,我在设置它们后直接检查值,但没有任何改变。我可以深入研究该值(悬停、导航到它、编辑值),因此它们似乎不是不可编辑的。

有什么想法我在这里做错了吗?

更新: 感谢 billinkc,只要满足其他条件,我就可以放心我正在做的事情。我发现代码中的直接分配失败(没有错误,只是不要“接受”)并且我无法在监视窗口中编辑值。我可以在检查值时编辑它们。

实际问题可能是有一个设置将这些标记为只读吗?

找到答案: 需要在设置值之前使变量可写:

        pkg.Variables["User::FileName"].EvaluateAsExpression = false;
4

1 回答 1

1

你做对了。我创建了一个基本的 SSIS 包。有一个变量,FolderPath,类型字符串。有一个触发信息事件的脚本任务,其内容公开了 FolderPath 变量的值

在此处输入图像描述

然后我创建了一个像这样的基本 C# 控制台应用程序

public class InformationListener : DefaultEvents
{
    public override void OnInformation(DtsObject source, int informationCode, string subComponent, string description, string helpFile, int helpContext, string idofInterfaceWithError, ref bool fireAgain)
    {
        //base.OnInformation(source, informationCode, subComponent, description, helpFile, helpContext, idofInterfaceWithError, ref fireAgain);
        Console.WriteLine(string.Format("{0} {1}", subComponent, description));
    }

}

class Program
{
    static void Main(string[] args)
    {
        string sourcePackage = string.Empty;
        string path = string.Empty;
        string variableName = string.Empty;
        string designValue = string.Empty;
        string newValue = string.Empty;
        InformationListener listener = null;

        sourcePackage = @"J:\Src\SO\SSIS\Package.dtsx";
        path = @"J:\runtime";
        variableName = "User::FolderPath";
        listener = new InformationListener();

        Application app = new Application();
        Package pkg = null;
        Variable ssisVariable = null;
        pkg = app.LoadPackage(sourcePackage, null);

        ssisVariable = pkg.Variables[variableName];
        designValue = ssisVariable.Value.ToString();

        Console.WriteLine(string.Format("Designtime value = {0}", designValue));

        ssisVariable.Value = path;

        newValue = ssisVariable.Value.ToString();
        Console.WriteLine(string.Format("new value = {0}", newValue));

        DTSExecResult results = DTSExecResult.Canceled;

        results = pkg.Execute(null, null, listener, null, null);

        Console.WriteLine("Press any key to continue");
        Console.ReadKey();

    }
}

从变量检查中可以看出

在此处输入图像描述

并从我的印刷声明中

在此处输入图像描述

的设计时值是C:\designTime因为J:我忘记在上面转义我的字符串,但我们可以假装它显示J:\runtime

综上所述,除非我们通过调用SaveToXml方法来序列化包,否则一旦对象超出范围,User::FolderPath 的值就会重置为设计时值。永久更新看起来像

app.SaveToXml(sourcePackage, pkg, null);

OP EDIT这个讨论和例子让我得到了答案: http ://social.msdn.microsoft.com/Forums/sqlserver/en-US/dad8e218-1fe0-49db-89da-5715fb6d4b21/sql-2008-r2-ssis- c-script-task-not-setting-variable

于 2013-10-03T02:05:29.787 回答