Saltar al contenido

Paquete SSIS de ingeniería inversa usando C#

Esta es el arreglo más válida que encomtrarás compartir, sin embargo mírala pausadamente y analiza si se puede adaptar a tu proyecto.

Solución:

El servidor SQL proporciona ensamblajes para manipular paquetes mediante programación.

Para hacer ingeniería inversa (deserializar un paquete dtsx), Tienes que hacer esto recorriendo paquetes y leerlos programáticamente, solo sigue este enlace detallado

  • Lectura de paquetes DTS y SSIS mediante programación

hay otra manera (manera más difícil y no recomendada) para lograr esto, lea dtsx como archivo de texto y analice el contenido xml. verifique mi respuesta en la siguiente pregunta para obtener un ejemplo:

  • Automatice la recuperación del número de versión de archivos .Dtsx

Insinuación:

simplemente abra el paquete en Visual Studio. Ve a la package explorer pestaña (cerca control flow y data flow pestañas) encontrará una vista de árbol. lo guiará en la forma en que debe buscar el componente que necesita

ingrese la descripción de la imagen aquí


Actualización 1 – C# Script @ 2019-07-08

Si está buscando un script que enumere todos los objetos del paquete, puede usar un script similar:

using System;
using DtsRuntime = Microsoft.SqlServer.Dts.Runtime;
using DtsWrapper = Microsoft.SqlServer.Dts.Pipeline.Wrapper;

public void Main()

    string pkgLocation;
    DtsRuntime.Package pkg;
    DtsRuntime.Application app;
    DtsRuntime. DTSExecResult pkgResults;

    pkgLocation =
      @"D:TestPackage 1.dtsx";
    app = new DtsRuntime.Application();
    pkg = app.LoadPackage(pkgLocation, null);

    //List Executables (Tasks)
    foreach(DtsRuntime.Executable tsk in pkg.Executables)
    


        DtsRuntime.TaskHost TH = (DtsRuntime.TaskHost)tsk;
        MessageBox.Show(TH.Name + "t" + TH.HostType.ToString());


        //Data Flow Task components
        if (TH.InnerObject.ToString() == "System.__ComObject")
        
            try
            

                DtsWrapper.MainPipe m = (DtsWrapper.MainPipe)TH.InnerObject;


                DtsWrapper.IDTSComponentMetaDataCollection100 mdc = m.ComponentMetaDataCollection;


                foreach (DtsWrapper.IDTSComponentMetaData100 md in mdc)


                

                    MessageBox.Show(TH.Name.ToString() + " - " + md.Name.ToString());


                

            
            catch 

            // If it is not a data flow task then continue foreach loop

            



        



    

    //Event Handlers
    foreach(DtsRuntime.DtsEventHandler eh in pkg.EventHandlers)
    

        MessageBox.Show(eh.Name + " - " + CM.HostType);

    

    //Connection Manager

    foreach(DtsRuntime.ConnectionManager CM in pkg.Connections)
    

        MessageBox.Show(CM.Name + " - " + CM.HostType);


    


    //Parameters
    foreach (DtsRuntime.Parameter Param in pkg.Parameters)
    

        MessageBox.Show(Param.Name + " - " + Param.DataType.ToString());


    


    //Variables
    foreach (DtsRuntime.Variable Var in pkg.Variables)
    

        MessageBox.Show(Var.Name + " - " + Var.DataType.ToString());


    

    //Precedence Constraints
    foreach (DtsRuntime.PrecedenceConstraint PC in pkg.PrecedenceConstraints)
    

        MessageBox.Show(PC.Name);


    


Referencias

  • Cargar y ejecutar un paquete local mediante programación

Actualización 2: Proyecto SSISPackageExplorer @ 2019-07-10

Comencé un pequeño proyecto llamado SSISPackageExplorer en Git-Hub que permite al usuario leer los objetos del paquete en un TreeView. Es muy básico en este momento, pero intentaré mejorarlo dentro de un tiempo:

  • GitHub – SSISPackageExplorer

ingrese la descripción de la imagen aquí

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *