如何从.NET执行SSIS包?


85

我有一个SSIS程序包,最终我也想传递参数,这些参数将来自.NET应用程序(VB或C#),所以我很好奇是否有人知道如何执行此操作,或者更好的是有有用提示的网站关于如何做。

因此,基本上我想从.NET中传递一个可以在其中使用的SSIS软件包参数来执行SSIS软件包。

例如,SSIS包将使用平面文件导入SQL db,但是文件的路径和名称可能是从.Net应用程序传递的参数。



10
致将来的读者:在使用以下解决方案之前,请查看您的许可。我相信这仅适用于安装了SSIS的计算机,而不仅仅是DLL参考。在生产环境中,通常即使安装SSIS而不安装DB引擎本身也需要许可证。
John Spiegel

谁能确认@JohnSpiegel的评论?如果安装了SSIS,这仅在生产环境中有效吗?
乔什·诺

仅供参考,链接,运行SSIS包编程改为docs.microsoft.com/en-us/archive/blogs/michen/...
LoJo

Answers:


58

这是通过代码在包中设置变量的方法-

using Microsoft.SqlServer.Dts.Runtime;

private void Execute_Package()
    {           
        string pkgLocation = @"c:\test.dtsx";

        Package pkg;
        Application app;
        DTSExecResult pkgResults;
        Variables vars;

        app = new Application();
        pkg = app.LoadPackage(pkgLocation, null);

        vars = pkg.Variables;
        vars["A_Variable"].Value = "Some value";               

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

        if (pkgResults == DTSExecResult.Success)
            Console.WriteLine("Package ran successfully");
        else
            Console.WriteLine("Package failed");
    }

2
@IanCampbell我假设您是指Microsoft.SqlServer.Dts.Runtime?Dts只是SSIS的旧名称-只是名称空间声明。上面的代码将继续受支持。
Spikeh 2013年

3
@IanCampbell是的,DTS已过时(事实上,我认为您甚至不能在SQL Server的最新版本中使用DTS-并不是我试图找到它!)。但是,包含某些SSIS组件的.Net命名空间仍包含Dts字。我向您保证,这是当前版本,并且有效。
Spikeh 2013年

4
好的,谢谢@Spikeh!值得注意的是,当我最近实现类似的代码以用Dts加载SSIS包时,我不得不Microsoft.SqlServer.ManagedDTS.dllC:\Windows\assembly文件夹中的“ GAC”手动获取文件来编译此类代码。
伊恩·坎贝尔

3
是的,我也是-昨天我也一样!我正在使用VS2012和.Net 4(用于SSIS包)/4.5(用于单元测试)。我必须从C:\ Windows \ Microsoft.NET \ assembly \ GAC_MSIL \ Microsoft.SqlServer.ManagedDTS \ v4.0_11.0.0.0__89845dcd8080cc91获取程序集,因为它在任何其他程序集文件夹或SQL文件夹。
Spikeh 2013年

1
到MSDN的一些链接:1)本地软件包(同一台机器):msdn.microsoft.com/en-us/library/ms136090.aspx。2)使用SQL代理作业的远程软件包(存储在运行该程序的计算机以外的计算机上):msdn.microsoft.com/zh-cn/library/ms403355.aspx
Faiz

21

这是SQL Server 2012引入的SSDB目录的处理方法...

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data.SqlClient;

using Microsoft.SqlServer.Management.IntegrationServices;

public List<string> ExecutePackage(string folder, string project, string package)
{
    // Connection to the database server where the packages are located
    SqlConnection ssisConnection = new SqlConnection(@"Data Source=.\SQL2012;Initial Catalog=master;Integrated Security=SSPI;");

    // SSIS server object with connection
    IntegrationServices ssisServer = new IntegrationServices(ssisConnection);

    // The reference to the package which you want to execute
    PackageInfo ssisPackage = ssisServer.Catalogs["SSISDB"].Folders[folder].Projects[project].Packages[package];

    // Add a parameter collection for 'system' parameters (ObjectType = 50), package parameters (ObjectType = 30) and project parameters (ObjectType = 20)
    Collection<PackageInfo.ExecutionValueParameterSet> executionParameter = new Collection<PackageInfo.ExecutionValueParameterSet>();

    // Add execution parameter (value) to override the default asynchronized execution. If you leave this out the package is executed asynchronized
    executionParameter.Add(new PackageInfo.ExecutionValueParameterSet { ObjectType = 50, ParameterName = "SYNCHRONIZED", ParameterValue = 1 });

    // Add execution parameter (value) to override the default logging level (0=None, 1=Basic, 2=Performance, 3=Verbose)
    executionParameter.Add(new PackageInfo.ExecutionValueParameterSet { ObjectType = 50, ParameterName = "LOGGING_LEVEL", ParameterValue = 3 });

    // Add a project parameter (value) to fill a project parameter
    executionParameter.Add(new PackageInfo.ExecutionValueParameterSet { ObjectType = 20, ParameterName = "MyProjectParameter", ParameterValue = "some value" });

    // Add a project package (value) to fill a package parameter
    executionParameter.Add(new PackageInfo.ExecutionValueParameterSet { ObjectType = 30, ParameterName = "MyPackageParameter", ParameterValue = "some value" });

    // Get the identifier of the execution to get the log
    long executionIdentifier = ssisPackage.Execute(false, null, executionParameter);

    // Loop through the log and do something with it like adding to a list
    var messages = new List<string>();
    foreach (OperationMessage message in ssisServer.Catalogs["SSISDB"].Executions[executionIdentifier].Messages)
    {
        messages.Add(message.MessageType + ": " + message.Message);
    }

    return messages;
}

该代码是对 http://social.technet.microsoft.com/wiki/contents/articles/21978.execute-ssis-2012-package-with-parameters-via-net.aspx?CommentPosted=true#commentmessage

http://domwritescode.com/2014/05/15/project-deployment-model-changes/上也有类似的文章


microsoft.sqlserver.management.integrationservices.dll在哪里?我已安装SQL2014,但在Windows搜索中找不到它。


我可以在打包部署中使用以上代码吗?我找不到任何方法。
Manish Jain

7

要添加到@Craig Schwarze答案,

以下是一些相关的MSDN链接:

以编程方式加载和运行本地程序包:

以编程方式加载和运行远程程序包

从正在运行的程序包中捕获事件:

using System;
using Microsoft.SqlServer.Dts.Runtime;

namespace RunFromClientAppWithEventsCS
{
  class MyEventListener : DefaultEvents
  {
    public override bool OnError(DtsObject source, int errorCode, string subComponent, 
      string description, string helpFile, int helpContext, string idofInterfaceWithError)
    {
      // Add application-specific diagnostics here.
      Console.WriteLine("Error in {0}/{1} : {2}", source, subComponent, description);
      return false;
    }
  }
  class Program
  {
    static void Main(string[] args)
    {
      string pkgLocation;
      Package pkg;
      Application app;
      DTSExecResult pkgResults;

      MyEventListener eventListener = new MyEventListener();

      pkgLocation =
        @"C:\Program Files\Microsoft SQL Server\100\Samples\Integration Services" +
        @"\Package Samples\CalculatedColumns Sample\CalculatedColumns\CalculatedColumns.dtsx";
      app = new Application();
      pkg = app.LoadPackage(pkgLocation, eventListener);
      pkgResults = pkg.Execute(null, null, eventListener, null, null);

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

1

因此,您实际上还有另一种方法可以从任何语言触发它。我认为,最好的方法是,您可以创建一个批处理文件,该文件将调用您的.dtsx包。

接下来,您可以使用任何语言调用批处理文件。与在Windows平台中一样,您可以在任何地方运行批处理文件,我认为这将是您用途中最通用的方法。没有代码依赖性。

以下是更多详细信息的博客。

https://www.mssqltips.com/sqlservertutorial/218/command-line-tool-to-execute-ssis-packages/

快乐的编码.. :)

谢谢阿妍


0

如果您在SSIS中有一些变量,则可以使用此函数。

    Package pkg;

    Microsoft.SqlServer.Dts.Runtime.Application app;
    DTSExecResult pkgResults;
    Variables vars;

    app = new Microsoft.SqlServer.Dts.Runtime.Application();
    pkg = app.LoadPackage(" Location of your SSIS package", null);

    vars = pkg.Variables;

    // your variables
    vars["somevariable1"].Value = "yourvariable1";
    vars["somevariable2"].Value = "yourvariable2";

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

    if (pkgResults == DTSExecResult.Success)
    {
        Console.WriteLine("Package ran successfully");
    }
    else
    {

        Console.WriteLine("Package failed");
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.