Wie führe ich ein SSIS-Paket aus .NET aus?

85

Ich habe ein SSIS-Paket, das ich eventuell auch übergeben möchte. Diese Parameter stammen aus einer .NET-Anwendung (VB oder C #). Ich war also gespannt, ob jemand weiß, wie das geht, oder besser noch eine Website mit hilfreichen Hinweisen wie es geht.

Grundsätzlich möchte ich ein SSIS-Paket aus .NET ausführen und dabei die SSIS-Paketparameter übergeben, die es darin verwenden kann.

Das SSIS-Paket verwendet beispielsweise den Import von Flatfiles in eine SQL-Datenbank. Der Pfad und der Name der Datei können jedoch der Parameter sein, der von der .NET-Anwendung übergeben wird.

Hadi
quelle
10
Für zukünftige Leser: Bevor Sie die unten stehende Lösung verwenden, überprüfen Sie Ihre Lizenzierung. Ich glaube, dies funktioniert nur auf Computern mit installiertem SSIS, nicht nur auf der DLL-Referenz. In einer Produktionsumgebung ist für die Installation von SSIS ohne Installation der DB-Engine in der Regel eine Lizenz erforderlich.
John Spiegel
Kann jemand den Kommentar von @ JohnSpiegel bestätigen? Funktioniert dies nur in einer Produktionsumgebung, wenn SSIS installiert ist?
Josh Noe
Zu Ihrer
Information

Antworten:

58

So setzen Sie Variablen im Paket aus 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
quelle
2
@ IanCampbell Ich nehme an, Sie beziehen sich auf Microsoft.SqlServer.Dts.Runtime? Dts ist nur der Legacy-Name für SSIS - es ist nur die Namespace-Deklaration. Der obige Code wird in Zukunft unterstützt.
Spikeh
3
@IanCampbell Ja, DTS wird abgeschrieben (ich glaube nicht, dass Sie DTS mit den neuesten Versionen von SQL Server verwenden können - nicht, dass ich versucht hätte, es zu finden!). Der .Net-Namespace, der einige der SSIS-Komponenten enthält, enthält jedoch weiterhin das Wort Dts. Ich versichere Ihnen, es ist die aktuelle Version und ist gültig.
Spikeh
4
Ok, danke @Spikeh! Als ich kürzlich ähnlichen Code zum Laden eines SSIS-Pakets mit Dts implementiert habe, musste ich die Microsoft.SqlServer.ManagedDTS.dllDatei manuell aus dem "GAC" im C:\Windows\assemblyOrdner abrufen, um diesen Code zu kompilieren.
Ian Campbell
3
Ja, ich auch - ich habe gestern dasselbe gemacht! Ich verwende VS2012 und .Net 4 (für das SSIS-Paket) / 4.5 (für meine Unit-Tests). Ich musste die Assembly von C: \ Windows \ Microsoft.NET \ Assembly \ GAC_MSIL \ Microsoft.SqlServer.ManagedDTS \ v4.0_11.0.0.0__89845dcd8080cc91 abrufen, da sie in keinem der anderen Assemblyordner oder im Ordner vorhanden war SQL-Ordner.
Spikeh
1
Einige Links zu MSDN: 1) Lokales Paket (gleicher Computer): msdn.microsoft.com/en-us/library/ms136090.aspx . 2) Remote-Paket (auf einem anderen Computer als dem, auf dem das Programm ausgeführt wird) unter Verwendung von SQL-Agent-Jobs: msdn.microsoft.com/en-us/library/ms403355.aspx
Faiz
21

So geht's mit dem SSDB-Katalog, der mit SQL Server 2012 eingeführt wurde ...

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

Der Code ist eine geringfügige Anpassung von http://social.technet.microsoft.com/wiki/contents/articles/21978.execute-ssis-2012-package-with-parameters-via-net.aspx?CommentPosted=true#commentmessage

Es gibt auch einen ähnlichen Artikel unter http://domwritescode.com/2014/05/15/project-deployment-model-changes/

Paul Hatcher
quelle
Wo befindet sich die Datei microsoft.sqlserver.management.integrationservices.dll? Ich habe SQL2014 installiert und kann es bei einer Windows-Suche nicht finden.
Kann ich den obigen Code für die Paketbereitstellung verwenden? Ich konnte keine Methode finden.
Manish Jain
7

Um zu @Craig Schwarze Antwort hinzuzufügen,

Hier sind einige verwandte MSDN-Links:

Programmgesteuertes Laden und Ausführen eines lokalen Pakets:

Programmgesteuertes Laden und Ausführen eines Remote-Pakets

Erfassen von Ereignissen aus einem laufenden Paket:

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
quelle
1

Es gibt also eine andere Möglichkeit, es aus jeder Sprache heraus abzufeuern. Am besten denke ich, Sie können einfach eine Batch-Datei erstellen, die Ihr .dtsx-Paket aufruft.

Als nächstes rufen Sie die Batch-Datei aus einer beliebigen Sprache auf. Wie in der Windows-Plattform können Sie Batch-Dateien von überall aus ausführen. Ich denke, dies ist der allgemeinste Ansatz für Ihren Zweck. Keine Code-Abhängigkeiten.

Unten ist ein Blog für weitere Details.

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

Viel Spaß beim Codieren .. :)

Danke, Ayan

Ayan Chakraborty
quelle
0

Sie können diese Funktion verwenden, wenn Sie eine Variable im SSIS haben.

    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
quelle