Come eseguire un pacchetto SSIS da .NET?


87

Ho un pacchetto SSIS che alla fine vorrei passare anche i parametri, questi parametri verranno da un'applicazione .NET (VB o C #) quindi ero curioso se qualcuno sapesse come farlo, o meglio ancora un sito Web con suggerimenti utili su come farlo.

Quindi fondamentalmente voglio eseguire un pacchetto SSIS da .NET passando i parametri del pacchetto SSIS che può utilizzare al suo interno.

Ad esempio, il pacchetto SSIS utilizzerà l'importazione di file flat in un database SQL, tuttavia il percorso e il nome del file potrebbero essere il parametro passato dall'applicazione .Net.



10
Per i futuri lettori: prima di utilizzare la soluzione di seguito, rivedere la licenza. Credo che questo funzioni solo su macchine con SSIS installato, non solo il riferimento DLL. In un ambiente di produzione, in genere anche l'installazione di SSIS senza installare il motore DB stesso richiede una licenza.
John Spiegel

Qualcuno può confermare il commento di @ JohnSpiegel? Funzionerà solo in un ambiente di produzione se è installato SSIS?
Josh Noe

Cordiali saluti, il collegamento all'esecuzione del
LoJo

Risposte:


59

Ecco come impostare le variabili nel pacchetto dal codice:

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 presumo che ti riferisci a Microsoft.SqlServer.Dts.Runtime? Dts è solo il nome legacy di SSIS, è solo la dichiarazione dello spazio dei nomi. Il codice sopra è supportato in futuro.
Spikeh

3
@IanCampbell Sì, DTS è deprezzato (in effetti, non penso che tu possa usare DTS con le ultime versioni di SQL Server - non che io abbia provato a trovarlo!). Tuttavia, lo spazio dei nomi .Net contenente alcuni dei componenti SSIS contiene ancora la parola Dts. Ti assicuro che è la versione attuale ed è valida.
Spikeh

4
Ok, grazie @Spikeh! Da notare, quando di recente ho implementato codice simile per caricare un pacchetto SSIS con Dts, ho dovuto ottenere manualmente il Microsoft.SqlServer.ManagedDTS.dllfile dal "GAC", nella C:\Windows\assemblycartella, per compilare tale codice.
Ian Campbell

3
Sì, anche io - stavo facendo lo stesso ieri! Sto usando VS2012 e .Net 4 (per il pacchetto SSIS) / 4.5 (per i miei unit test). Ho dovuto ottenere l'assembly da C: \ Windows \ Microsoft.NET \ assembly \ GAC_MSIL \ Microsoft.SqlServer.ManagedDTS \ v4.0_11.0.0.0__89845dcd8080cc91 in quanto non esisteva in nessuna delle altre cartelle di assembly o nel Cartelle SQL.
Spikeh

1
Alcuni collegamenti a MSDN: 1) Pacchetto locale (stesso computer): msdn.microsoft.com/en-us/library/ms136090.aspx . 2) Pacchetto remoto (memorizzato su una macchina diversa da quella su cui è in esecuzione il programma), utilizzando i processi dell'agente SQL: msdn.microsoft.com/en-us/library/ms403355.aspx
Faiz

22

Ecco come farlo con il catalogo SSDB introdotto 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;
}

Il codice è un leggero adattamento di http://social.technet.microsoft.com/wiki/contents/articles/21978.execute-ssis-2012-package-with-parameters-via-net.aspx?CommentPosted=true#commentmessage

C'è anche un articolo simile su http://domwritescode.com/2014/05/15/project-deployment-model-changes/


Dove si trova microsoft.sqlserver.management.integrationservices.dll? Ho installato SQL2014 e non riesco a trovarlo facendo una ricerca su Windows.


Posso usare il codice sopra con la distribuzione del pacchetto? Non sono riuscito a trovare alcun metodo.
Manish Jain,

7

Da aggiungere alla risposta di @Craig Schwarze,

Di seguito sono riportati alcuni collegamenti MSDN correlati:

Caricamento ed esecuzione di un pacchetto locale a livello di codice:

Caricamento ed esecuzione di un pacchetto remoto a livello di programmazione

Acquisizione di eventi da un pacchetto in esecuzione:

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

Quindi c'è un altro modo in cui puoi effettivamente attivarlo da qualsiasi lingua. Il modo migliore penso, puoi semplicemente creare un file batch che chiamerà il tuo pacchetto .dtsx.

Successivamente si chiama il file batch da qualsiasi lingua. Come nella piattaforma Windows, puoi eseguire file batch da qualsiasi luogo, penso che questo sarà l'approccio più generico per il tuo scopo. Nessuna dipendenza dal codice.

Di seguito è riportato un blog per maggiori dettagli ..

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

Buona programmazione .. :)

Grazie, Ayan


0

Puoi usare questa funzione se hai qualche variabile in 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");
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.