【问题标题】:How to change SSIS variable values in C#如何在 C# 中更改 SSIS 变量值
【发布时间】:2013-10-02 22:46:23
【问题描述】:

我正在尝试在从 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;

【问题讨论】:

  • 调试时,Path.GetDirectoryName(e.FullPath)Path.GetFileNameWithoutExtension(e.FullPath) 里面有什么。这些是实际值吗?
  • e 是一个 FileSystemEventArgs 参数,它确实包含有关新创建文件的信息。

标签: c# ssis


【解决方案1】:

你做得对。我创建了一个基本的 SSIS 包。有一个变量,FolderPath,类型字符串。有一个脚本任务会触发 Information 事件,其内容会公开 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

【讨论】:

  • 感谢您验证方法没问题。现在让我知道为什么变量是半只读的。我的代码内值分配失败,尝试通过监视窗口进行编辑也失败了,但是在检查变量时钻入允许我进行编辑。
  • 如果你像上面这样创建一个超级简单的例子,你仍然得到相同的结果吗?是否有分配给变量的表达式或阻止您的分配通过的配置?
  • 再次感谢。讨论使我找到了我添加的答案。不知道要不然我自己的头撞墙要花多少小时。
  • 啊,所以其中一个变量设置了 EvaluateAsExpression?
  • 确实如此。我仍然觉得很奇怪的是,我可以在检查值时绕过它“后门”,但不能在 Watch 窗口或代码中。似乎是关于如何规避/解决问题以及 VS 如何在内部实际工作的有用信息。 (不过,我会把它留给更聪明的人)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
  • 2011-02-04
相关资源
最近更新 更多