Comment exécuter un package SSIS à partir de .NET?

85

J'ai un package SSIS que j'aimerais éventuellement transmettre également des paramètres, ces paramètres proviendront d'une application .NET (VB ou C #), donc j'étais curieux de savoir comment faire cela, ou mieux encore un site Web avec des conseils utiles sur la façon de le faire.

Donc, fondamentalement, je veux exécuter un package SSIS à partir de .NET en passant les paramètres de package SSIS qu'il peut utiliser.

Par exemple, le package SSIS utilisera l'importation de fichiers plats dans une base de données SQL, mais le chemin et le nom du fichier peuvent être le paramètre transmis à partir de l'application .Net.

Hadi
la source
10
Aux futurs lecteurs: avant d'utiliser la solution ci-dessous, vérifiez votre licence. Je crois que cela ne fonctionne que sur les machines avec SSIS installé, pas seulement la référence DLL. Dans un environnement de production, même l'installation de SSIS sans installer le moteur de base de données lui-même nécessite une licence.
John Spiegel
Quelqu'un peut-il confirmer le commentaire de @ JohnSpiegel? Cela fonctionnera-t-il uniquement sur un environnement de production si SSIS est installé?
Josh Noe
Pour info, le lien vers l'exécution du package SSIS par programme a été changé en docs.microsoft.com/en-us/archive/blogs/michen
...

Réponses:

58

Voici comment définir des variables dans le package à partir du code -

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
la source
2
@IanCampbell Je suppose que vous faites référence à Microsoft.SqlServer.Dts.Runtime? Dts est juste le nom hérité de SSIS - c'est juste la déclaration d'espace de noms. Le code ci-dessus est pris en charge à l'avenir.
Spikeh le
3
@IanCampbell Oui, DTS est déprécié (en fait, je ne pense pas que vous puissiez même utiliser DTS avec les dernières versions de SQL Server - pas que j'ai essayé de le trouver!). Cependant, l'espace de noms .Net contenant certains des composants SSIS contient toujours le mot Dts. Je vous assure que c'est la version actuelle et qu'elle est valide.
Spikeh le
4
Ok, merci @Spikeh! À noter, lorsque j'ai récemment implémenté un code similaire pour charger un package SSIS avec Dts, j'ai dû obtenir manuellement le Microsoft.SqlServer.ManagedDTS.dllfichier du "GAC", dans le C:\Windows\assemblydossier, pour compiler ce code.
Ian Campbell
3
Oui, moi aussi - je faisais la même chose hier! J'utilise VS2012 et .Net 4 (pour le package SSIS) / 4.5 (pour mes tests unitaires). J'ai dû obtenir l'assemblage de C: \ Windows \ Microsoft.NET \ assembly \ GAC_MSIL \ Microsoft.SqlServer.ManagedDTS \ v4.0_11.0.0.0__89845dcd8080cc91 car il n'existait dans aucun des autres dossiers d'assemblage, ou dans le Dossiers SQL.
Spikeh
1
Quelques liens vers MSDN: 1) Package local (même ordinateur ): msdn.microsoft.com/en-us/library/ms136090.aspx . 2) Package distant (stocké sur une machine autre que celle sur laquelle le programme est en cours d'exécution), utilisant les travaux de l'agent SQL: msdn.microsoft.com/en-us/library/ms403355.aspx
Faiz
21

Voici comment faire avec le catalogue SSDB qui a été introduit avec 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;
}

Le code est une légère adaptation de http://social.technet.microsoft.com/wiki/contents/articles/21978.execute-ssis-2012-package-with-parameters-via-net.aspx?CommentPosted=true#commentmessage

Il existe également un article similaire sur http://domwritescode.com/2014/05/15/project-deployment-model-changes/

Paul Hatcher
la source
Où se trouve microsoft.sqlserver.management.integrationservices.dll? J'ai installé SQL2014 et je ne peux pas le trouver en faisant une recherche Windows.
Puis-je utiliser le code ci-dessus avec le déploiement de package? Je n'ai trouvé aucune méthode.
Manish Jain du
7

Pour ajouter à la réponse @Craig Schwarze,

Voici quelques liens MSDN associés:

Chargement et exécution d'un package local par programme:

Chargement et exécution d'un package distant par programme

Capture d'événements à partir d'un package en cours d'exécution:

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
la source
1

Il existe donc une autre façon de le déclencher à partir de n'importe quelle langue. La meilleure façon que je pense, vous pouvez simplement créer un fichier batch qui appellera votre package .dtsx.

Ensuite, vous appelez le fichier de commandes à partir de n'importe quelle langue. Comme dans la plate-forme Windows, vous pouvez exécuter un fichier batch de n'importe où, je pense que ce sera l'approche la plus générique pour votre objectif. Aucune dépendance de code.

Ci-dessous un blog pour plus de détails.

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

Bon codage .. :)

Merci, Ayan

Ayan Chakraborty
la source
0

Vous pouvez utiliser cette fonction si vous avez une variable dans le 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
la source