动态平面文件源路径

时间:2012-03-13 23:02:35

标签: c# sql-server-2008 ssis

我正在尝试将动态文件路径传递给SSIS包变量。我将ConnectionString值设置为连接表达式中的变量值。

所以要开始我将初始变量 name 值设置为products.csv并获取错误:

  

保存包时发生非致命错误:名称不能   包含以下任何字符:/ \:[]。 =

enter image description here

我从变量名中删除.csv,因为我从代码中传递了这个值 - 没什么大不了的。但是当我传递适当的变量并执行包时,我会感到很奇怪。我检查了数据库,并且包中有预期的值,但是我得到了一个类似于我上面提到的故障状态和错误。

以下是我的代码:

GeneralUtilities.ExecutePackage(
                new ListDictionary()
                    {
                        {"ClientId", Client.Id},
                        {"FileName", ConfigurationManager.AppSettings["DownloadLocation"] + @"\" + this.OriginalName}
                    },
                "Products.dtsx");

public static void ExecutePackage(ListDictionary variables, string packageName)
    {
        string pkgLocation;
        Package pkg;
        Application app;
        DTSExecResult pkgResults;
        Variables vars;

        pkgLocation = ConfigurationManager.AppSettings["PackageLocation"] + packageName;
        app = new Application();
        using (pkg = app.LoadPackage(pkgLocation, null))
        {
            vars = pkg.Variables;

            foreach (DictionaryEntry variable in variables)
            {
                vars[variable.Key].Value = variable.Value;
            }

            pkgResults = pkg.Execute(null, vars, null, null, null);

            for(int i=0;i<pkg.Errors.Count;i++)
                Console.WriteLine(pkg.Errors[i].Description);


            Console.WriteLine(pkgResults.ToString());
        }
    }

这是输出:

enter image description here

很酷的是它被输入到数据库中,但我不认为失败消息会起作用。看起来像包装设置或导致“虚假失败”的东西。有人可以提供帮助吗?感谢。

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:1)

此时,我认为我们需要更多信息。我构建了一个导入CSV的sample package;定义了2个变量(ClientId&amp; FileName);配置包以使用CM的ConnectionString属性的变量。最后,我使用您的代码来运行包。我没有收到任何错误。

我不熟悉带参数的Execute方法,所以我用两个版本的pkg.Execute测试了你的代码,结果是一样的(你可以通过将修改后的包保存为我在最后一行上进行比较并进行比较)。在执行之前,我的变量看起来像

  • ClientId:0
  • FileName:C:\ ssisdata \ so \ so_matt.csv
  • RowCount:0

执行并保存为so_JeffBorden2.dtsx后,我的变量已按预期修改。

  • ClientId:100
  • FileName:C:\ ssisdata \ so \ so_matt2.csv
  • RowCount:10

    private static void so_JeffBorden()
    {
    
        string path = @"C:\sandbox\SSISHackAndSlash2008\SSISHackAndSlash2008\so_JeffBorden.dtsx";
        ListDictionary variables;
        variables = new ListDictionary()
        {
            {"ClientId", 100},
            {"FileName", @"C:\ssisdata\so\so_matt2.csv"}
        };
    
        string pkgLocation;
        Package pkg;
        Application app;
        DTSExecResult pkgResults;
        Variables vars;
    
        pkgLocation = path;
        app = new Application();
        using (pkg = app.LoadPackage(pkgLocation, null))
        {
            vars = pkg.Variables;
    
            foreach (DictionaryEntry variable in variables)
            {
                vars[variable.Key].Value = variable.Value;
            }
    
            pkgResults = pkg.Execute(null, vars, null, null, null);
            //pkgResults = pkg.Execute();
    
            for (int i = 0; i < pkg.Errors.Count; i++)
                Console.WriteLine(pkg.Errors[i].Description);
    
            Console.WriteLine(pkgResults.ToString());
            app.SaveToXml(@"C:\sandbox\SSISHackAndSlash2008\SSISHackAndSlash2008\so_JeffBorden2.dtsx", pkg, null);
        }
    }
    

生成错误需要从示例代码中删除某些内容吗?如果您针对我的示例包运行完整代码,是否会遇到错误?

根本原因

屏幕截图中的错误表明有一个表达式为对象的Name属性赋值。 SSIS中的名称通常遵循.NET规则进行命名(排除连接管理器)。这个包中共有5个对象:两个变量和一个包含3个项目的数据流(我不擅长数学)。变量没有根据提供的代码修改其name属性。数据流中组件的名称都是默认名称,它们将数据流的名称保留为主要可疑项。请注意,数据流products的名称与变量@[User::FileName]的值完全匹配。问题仅在包执行时出现,这是FileName值唯一更改的时间。

为了测试这一点,在BIDS / SSDT中将变量FileName的值修改为'doh.txt',并且包应该因错误名称而开始抛出错误。

要解决此问题,请右键单击数据流,然后删除Name属性上的表达式,或者通过删除表达式中的有问题字符来清理字符串(自由使用REPLACE将起作用)