使用 C# 逆向工程 SSIS 包
Reverse engineering SSIS package using C#
需要提取 source
和 destination
的 source
、destination
和 column
个名称。为什么我要这样做是因为我有成千上万的包裹并且打开每个包裹平均有 60 to 75
列并列出所有必需的信息将花费大量时间并且它不是单一的时间要求和这个任务目前在我的组织中每两个月手动完成一次。
我正在寻找一些方法来逆向工程将所有包保存在一个文件夹中,然后遍历每个包并获取信息并将其放入一些电子表格中。
我想在xml
中打开包并获取感兴趣节点的信息并放入电子表格中,这有点麻烦。请建议有哪些可用的库。
SQL 服务器提供程序集以编程方式操作包。
要进行逆向工程(反序列化 dtsx 包),您必须通过循环包并以编程方式读取它们来完成此操作,只需遵循此详细说明 link
还有另一种方法(更难的方法,不推荐) 实现此目的,通过将 dtsx 读取为文本文件并解析 xml 内容。检查我对以下问题的回答以获取示例:
提示:
只需打开visual studio中的包裹即可。转到 package explorer
选项卡(靠近 control flow
和 data flow
选项卡),您会找到一个树视图。它将引导您搜索所需组件的方式
更新 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 中读取包对象,它现在非常基础,但我会在一段时间内尝试改进它:
dtsx Microsoft.SqlServer.Dts.Pipeline 中的某些属性不是 CLS-compliant。
ColumnInformation Class
Definition
Namespace:
Microsoft.SqlServer.Dts.Pipeline
Assembly:
Microsoft.SqlServer.PipelineHost.dll
Important
This API is not CLS-compliant.
C++
Copy
public ref class ColumnInformation
否则试试这个。
只需在记事本++中打开您的 dtsx 包。查找 table 名称,然后在所有包中对 属性 名称进行相同的搜索(查找所有文件)。我认为即使您搜索在文本编辑器中打开的 dtsx 中的列,它也会为您提供所有内容。它是手动的,但可以使用 Regex 和 c# 进行更新。我从来没有用正则表达式做过。我只做了一次notepad++和一个包。
需要提取 source
和 destination
的 source
、destination
和 column
个名称。为什么我要这样做是因为我有成千上万的包裹并且打开每个包裹平均有 60 to 75
列并列出所有必需的信息将花费大量时间并且它不是单一的时间要求和这个任务目前在我的组织中每两个月手动完成一次。
我正在寻找一些方法来逆向工程将所有包保存在一个文件夹中,然后遍历每个包并获取信息并将其放入一些电子表格中。
我想在xml
中打开包并获取感兴趣节点的信息并放入电子表格中,这有点麻烦。请建议有哪些可用的库。
SQL 服务器提供程序集以编程方式操作包。
要进行逆向工程(反序列化 dtsx 包),您必须通过循环包并以编程方式读取它们来完成此操作,只需遵循此详细说明 link
还有另一种方法(更难的方法,不推荐) 实现此目的,通过将 dtsx 读取为文本文件并解析 xml 内容。检查我对以下问题的回答以获取示例:
提示:
只需打开visual studio中的包裹即可。转到 package explorer
选项卡(靠近 control flow
和 data flow
选项卡),您会找到一个树视图。它将引导您搜索所需组件的方式
更新 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 中读取包对象,它现在非常基础,但我会在一段时间内尝试改进它:
dtsx Microsoft.SqlServer.Dts.Pipeline 中的某些属性不是 CLS-compliant。
ColumnInformation Class
Definition
Namespace:
Microsoft.SqlServer.Dts.Pipeline
Assembly:
Microsoft.SqlServer.PipelineHost.dll
Important
This API is not CLS-compliant.
C++
Copy
public ref class ColumnInformation
否则试试这个。
只需在记事本++中打开您的 dtsx 包。查找 table 名称,然后在所有包中对 属性 名称进行相同的搜索(查找所有文件)。我认为即使您搜索在文本编辑器中打开的 dtsx 中的列,它也会为您提供所有内容。它是手动的,但可以使用 Regex 和 c# 进行更新。我从来没有用正则表达式做过。我只做了一次notepad++和一个包。