c# - 使用 C# 逆向工程 SSIS 包

标签 c# sql-server ssis reverse-engineering etl

需要提取 source,destinationcolumn sourcedestination 的名称。我为什么要这样做是因为我有成千上万的包裹,打开每个包裹平均有 60 到 75 列,列出所有必需的信息将花费大量时间,而且它不是一个单一的时间要求,此任务目前在我的组织中每两个月手动完成一次。

我正在寻找一些方法来进行逆向工程,将所有包保存在一个文件夹中,然后遍历每个包并获取信息并将其放入某个电子表格中。

我想在 xml 中打开包并获取感兴趣节点的信息并将其放入电子表格中,这有点麻烦。请建议可以从哪些库开始。

最佳答案

SQL 服务器提供程序集以编程方式操作包。

要进行逆向工程(反序列化 dtsx 包),您必须通过循环包并以编程方式读取它们来执行此操作,只需点击此详细链接

还有另一种方法(更难的方法,不推荐)通过将dtsx读取为文本文件并解析xml内容来实现这一点。检查我对以下问题的回答以获取示例:

提示:

只需在 visual studio 中打开包。转到 package explorer 选项卡(靠近 control flowdata flow 选项卡),您将找到一个 TreeView 。它将引导您搜索所需组件的方式

enter image description here


更新 1 - C# 脚本 @ 2019-07-08

如果您正在寻找一个列出所有包对象的脚本,您可以使用类似的脚本:

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:\Test\Package 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);


    }

}

引用资料


更新 2 - SSISPackageExplorer 项目 @ 2019-07-10

我在 Git-Hub 上启动了一个名为 SSISPackageExplorer 的小项目,它允许用户读取 TreeView 中的包对象,它现在非常基础,但我会在一段时间内尝试改进它:

enter image description here

关于c# - 使用 C# 逆向工程 SSIS 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43562611/

相关文章:

c# - ResXFileCodeGenerator - 覆盖输出(想要使用自定义资源管理器)

c# - 具有多次插入的存储过程 SQL 和 ASP.Net

SQL Server 2005 : using OR operator with LIKE operator

.net - SSIS 中的调试

c# - C#中如何从数据库获取数据并将其放入变量中?

c# - 通过 Entity Framework Core 将列表传递给 View

c# - 徽章/成就

sql-server - 将数据导出到超过 255 列的 Excel 的解决方法

excel - 如何通过 OLEDB 或 SSIS 中的任何其他源连接 Excel 源?

c# - 使用 WPF 从自定义 JSON 显示 TreeView