从C#传递SSIS参数

7

我有一个SSIS包,其中设置了一些Project.params。

我该如何通过C#向SSIS包传递这些参数的值?

我正在尝试以下方法:

const string pkgLocation = @"export.dtsx";
var app = new Application();
var pkg = app.LoadPackage(pkgLocation, null);

var results = pkg.Execute();

这会返回一个失败,Errors集合中包含“变量“$Project::connString”在变量集合中未找到。该变量可能不存在于正确的范围内。”

所以我尝试添加:

var param = pkg.Parameters.Add("connString", TypeCode.String);
param.Value = "test"; 
var results = pkg.Execute();

但这会抛出DtsGenericException异常。


查看 LoadPackage 方法的文档。这是一个重载方法,应该有一个接受 5 个参数的方法,这是一种实现方式。哦,这是一个项目参数。我还没有通过 .net 启动使用项目部署模型的包。我猜你需要更多的代码,因为你需要引用项目的 ispac 才能让它知道项目级别的实体。 - billinkc
错误提到了变量集合和参数...你尝试把它添加到变量中了吗?pkg.Variables.Add("connString", false, "Project", "test");(假设您的变量命名空间是“Project”) - nemesv
尝试使用Package对象的Execute重载方法,该方法接受变量集合作为参数。https://msdn.microsoft.com/zh-cn/library/microsoft.sqlserver.dts.runtime.dtscontainer.execute.aspx - Alessi
我无法弄清楚。我感到羞愧。:( 我能够传递包级别的参数,但无法获取项目范围的参数。我猜这与“Project”类使用ispac有关,但我不知道如何处理“PackageItem”。 - billinkc
2个回答

6
我想我明白了。诀窍是将您的ispac文件反序列化(VS构建此文件,但您可以通过msbuild执行)成一个Project对象。 Project对象允许我们设置项目级参数(以及访问项目级连接管理器)。
从那里,我们需要引用特定的包,但它将是一个PackageItem。 PackageItems无法运行,但它们确实具有我们将用于实例化Package类的Package属性,该类具有一个Execute方法。
   public static void final()
    {
        string isPacPath = @"C:\sandbox\so_31812951\so_31812951\bin\Development\so_31812951.ispac";
        string packageName = "Package.dtsx";
        Application app = new Application();
        Package pkg = null;

        // https://msdn.microsoft.com/en-us/library/ff930196(v=sql.110).aspx
        Project proj = null;
        PackageItem pi = null;
        DTSExecResult results;

        ///////////////////////////////////////////////////////////////////
        // Run an SSIS package that has a Project parameter
        ///////////////////////////////////////////////////////////////////
        proj = Project.OpenProject(isPacPath);

        // Yes, I can see the packages in there
        foreach (var item in proj.PackageItems)
        {
            Console.WriteLine(string.Format("Project {0} contains package {1}", proj.Name, item.StreamName));
        }

        //Also able to see the project level parameters
        foreach (Parameter item in proj.Parameters)
        {
            Console.WriteLine(string.Format("Project {0} contains parameter {1} type of {2} current value {3}", proj.Name, item.Name, item.DataType, item.Value));
        }

        // assign a value to my project level parameter
        proj.Parameters["ProjectParameter"].Value = 10;

        // Get the package from the project collection
        pi = proj.PackageItems[packageName];

        // Convert the package into a package object
        pkg = pi.Package;

        // This is how we specify a package parameter value
        pkg.Parameters["PackageParam"].Value = 777;

        results = pkg.Execute();

        Console.WriteLine(results);
    }

这里假设你有一个名为so_31812951的SSIS项目,编译成位于C:\sandbox\so_31812951\so_31812951\bin\Development\so_31812951.ispac的ispac文件。该项目有一个名为Package.dtsx的单一包。还将有一个Project级别的Int32参数,名为ProjectParameter,以及一个包级别的Int32参数,名为PackageParam

完美地工作了。感谢您解决了这个问题。希望有更直接的方法来做到这一点! - TrailJon

-1

我相信你需要使用 ParameterValue 类。

var parameters = new ParameterValue[somelength];
parameters[index] = new ParameterValue()
{
     Name = "parameter name",
     Value = "parameter value"
}

报告服务将拥有一个方法:
SetExecutionParmeters(parameters, language).

我假设您正在将报告“export.dtsx”加载到SSIS中,并通过报告服务执行。


不是SSRS,而是SSIS。 - Matt Frear

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接