2008-11-07 29 views
74

Tengo un paquete SSIS que eventualmente también me gustaría pasar parámetros, estos parámetros vendrán de una aplicación .NET (VB o C#) así que tenía curiosidad si alguien sabe de cómo hacer esto, o mejor aún un sitio web con consejos ú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 un archivo SQL db; sin embargo, la ruta y el nombre del archivo podrían ser el parámetro que se pasa desde la aplicación .Net.¿Cómo ejecutar un paquete SSIS desde .NET?

+10

Para futuros lectores: antes de utilizar la siguiente solució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 DB en sí requiere una licencia. –

+0

[Ejecutando el paquete SSIS mediante programación] (http://blogs.msdn.com/michen/archive/2007/03/22/running-ssis-package-programmatically.aspx) –

+0

¿Alguien puede confirmar el comentario de @ JohnSpiegel? ¿Esto solo funcionará en un entorno de producción si está instalado SSIS? –

Respuesta

54

Aquí es cómo establecer las variables en el paquete de 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"); 
    } 
+0

Gracias @Craig! Sin embargo, 'Dts' ahora está en desuso a partir de SQL Server 2008, ¿cómo puedes hacer esto sin el paquete' Dts'? –

+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 es compatible en el futuro. – Spikeh

+0

@Spikeh - lo que me confunde es que Microsoft dice que Dts está en desuso y "ha sido reemplazado por SQL Server Integration Services": http://technet.microsoft.com/en-us/library/cc707786%28v=sql. 105% 29.aspx –

7

Para añadir a la respuesta @Craig Schwarze,

Éstos son algunos enlaces relacionados MSDN:

Loading and Running a Local Package Programmatically:

Loading and Running a Remote Package Programmatically

C apturing eventos de un paquete de reproducció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(); 
    } 
    } 
} 
14

Así es como hacer para que 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/

+0

¿Dónde se encuentra el microsoft.sqlserver.management.integrationservices.dll? Tengo SQL2014 instalado y no puedo encontrarlo haciendo una búsqueda de Windows. –

+1

Aparentemente solo está en el GAC: [Microsoft.SqlServer.Management.IntegrationServices.dll assembly location] (http://muxtonmumbles.blogspot.com.au/2012/08/programmatically-executing-packages-in.html) –

+0

Gracias . Lo tengo. Esa ubicación funcionó para mí. –

Cuestiones relacionadas