¿Cómo ejecutar un paquete SSIS desde .NET?

85

Tengo un paquete SSIS que eventualmente también me gustaría pasar parámetros, estos parámetros provendrán de una aplicación .NET (VB o C #), así que tenía curiosidad por saber si alguien sabe cómo hacer esto, o mejor aún, un sitio web con sugerencias útiles sobre cómo hacerlo.

Entonces, básicamente, quiero ejecutar un paquete SSIS desde .NET pasando los parámetros del paquete SSIS que puede usar dentro de él.

Por ejemplo, el paquete SSIS utilizará la importación de archivos planos en una base de datos SQL, sin embargo, la ruta y el nombre del archivo podrían ser el parámetro que se pasa desde la aplicación .Net.

Hadi
fuente
10
Para futuros lectores: antes de usar la solución a continuación, revise su licencia. Creo que esto solo funciona en máquinas con SSIS instalado, no solo en la referencia de DLL. En un entorno de producción, normalmente incluso la instalación de SSIS sin instalar el motor de base de datos requiere una licencia.
John Spiegel
¿Alguien puede confirmar el comentario de @ JohnSpiegel? ¿Esto solo funcionará en un entorno de producción si SSIS está instalado?
Josh Noe
Para su información, el enlace para ejecutar el paquete SSIS mediante programación se cambió a docs.microsoft.com/en-us/archive/blogs/michen/…
LoJo

Respuestas:

58

A continuación se explica cómo establecer variables en el paquete desde el código:

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");
    }
Craig Schwarze
fuente
2
@IanCampbell Supongo que se refiere a Microsoft.SqlServer.Dts.Runtime? Dts es solo el nombre heredado de SSIS, es solo la declaración del espacio de nombres. El código anterior se admite en el futuro.
Spikeh
3
@IanCampbell Sí, DTS está depreciado (de hecho, no creo que pueda usar DTS con las últimas versiones de SQL Server, ¡no es que haya intentado encontrarlo!). Sin embargo, el espacio de nombres .Net que contiene algunos de los componentes de SSIS todavía contiene la palabra Dts. Les aseguro que es la versión actual y es válida.
Spikeh
4
Ok, gracias @Spikeh! Es de destacar que cuando implementé recientemente un código similar para cargar un paquete SSIS con Dts, tuve que obtener manualmente el Microsoft.SqlServer.ManagedDTS.dllarchivo del "GAC", en la C:\Windows\assemblycarpeta, para compilar dicho código.
Ian Campbell
3
Sí, yo también. ¡Estaba haciendo lo mismo ayer! Estoy usando VS2012 y .Net 4 (para el paquete SSIS) / 4.5 (para mis pruebas unitarias). Tuve que obtener el ensamblaje de C: \ Windows \ Microsoft.NET \ assembly \ GAC_MSIL \ Microsoft.SqlServer.ManagedDTS \ v4.0_11.0.0.0__89845dcd8080cc91 ya que no existía en ninguna de las otras carpetas de ensamblaje, o en el Carpetas SQL.
Spikeh
1
Algunos enlaces a MSDN: 1) Paquete local (misma máquina): msdn.microsoft.com/en-us/library/ms136090.aspx . 2) Paquete remoto (almacenado en una máquina diferente a la que se ejecuta el programa), usando trabajos del agente SQL: msdn.microsoft.com/en-us/library/ms403355.aspx
Faiz
21

A continuación, le indicamos cómo hacerlo con el catálogo SSDB que se introdujo con SQL Server 2012 ...

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;
}

El código es una ligera adaptación de http://social.technet.microsoft.com/wiki/contents/articles/21978.execute-ssis-2012-package-with-parameters-via-net.aspx?CommentPosted=true#commentmessage

También hay un artículo similar en http://domwritescode.com/2014/05/15/project-deployment-model-changes/

Paul Hatcher
fuente
¿Dónde se encuentra microsoft.sqlserver.management.integrationservices.dll? Tengo SQL2014 instalado y no puedo encontrarlo haciendo una búsqueda en Windows.
¿Puedo usar el código anterior con la implementación del paquete? No pude encontrar ningún método.
Manish Jain
7

Para agregar a la respuesta de @Craig Schwarze,

A continuación, se muestran algunos enlaces de MSDN relacionados:

Carga y ejecución de un paquete local mediante programación:

Carga y ejecución de un paquete remoto mediante programación

Captura de eventos de un paquete en ejecución:

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();
    }
  }
}
Faiz
fuente
1

Así que hay otra forma de activarlo desde cualquier idioma. Creo que de la mejor manera, puede crear un archivo por lotes que llamará a su paquete .dtsx.

A continuación, llame al archivo por lotes desde cualquier idioma. Al igual que en la plataforma Windows, puede ejecutar archivos por lotes desde cualquier lugar, creo que este será el enfoque más genérico para su propósito. Sin dependencias de código.

A continuación se muestra un blog para obtener más detalles.

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

Feliz codificación .. :)

Gracias ayan

Ayan Chakraborty
fuente
0

Puede usar esta función si tiene alguna variable en el 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");
    }
rafayel ahmed
fuente