2

我正在使用工具(C#.Net)来分析 SSIS 包。在这里,我使用Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSComponentMetaData100(dts.interop 中的类)类来迭代数据流任务(MainPipe)。请在下面找到代码。

//Cast the Executable as a data flow
MainPipe pipe = (MainPipe)taskHost.InnerObject;
foreach (IDTSComponentMetaData100 comp in pipe.ComponentMetaDataCollection)
{
//Here i need
//1. Source details
//2. Destination details

}

是否可以将每个IDTSComponentMetaData100对象类型转换为 XMLSource、OLEDB Destination 等数据流组​​件的某些对象?如果可能,我将如何识别来源、目的地等?

如果不可能,请提供一些提示来实现这一点。

4

2 回答 2

2

简短的回答是,没有特别有用的方法可以将 anIDTSComponentMetaData100转换为“数据流组件的对象”,这在很大程度上是因为没有“数据流组件的对象”。在幕后,SSIS 是一个COM驱动的应用程序,特别是对于库存组件,而不是一个原生的 .NET 应用程序。这就是为什么以编程方式创建 SSIS 数据流如此痛苦的部分原因。(有关更详细的讨论,请参阅在 MSDN 中以编程方式添加数据流组件 。)

也就是说,该IDTSComponentMetaData100接口确实公开了一个ObjectType属性,即DTSObjectType枚举。数据流中的源将具有ObjectTypeof OT_SOURCEADAPTER、destinationOT_DESTINATIONADAPTER和转换OT_TRANSFORM

或者,您可以研究将包保存为 .dtsx 文件并解析生成的 XML 本身。

于 2013-03-20T22:15:25.280 回答
0

基于上面 Edmunds 的回答,您可以测试 OT_SOURCEADAPTER 和 OT_DESTINATION 对象类型,然后通过 RuntimeConnectionCollection 遍历自定义属性和任何链接的连接。这将允许您检索任何自定义属性值或关联的连接以及任何连接属性,例如连接名称。
下面的伪代码用于显示自定义属性并获取源连接名称,假设您已经打开了包并引用了 MainPipe。

Mainpipe df; 
Package pkg;

foreach (IDTSComponentMetaData100 comp in df.ComponentMetaDataCollection)
{
  if ((comp.ObjectType & DTSObjectType.OT_SOURCEADAPTER ) == DTSObjectType.OT_SOURCEADAPTER )
  {

    foreach (IDTSCustomProperty100 cp in comp.CustomPropertyCollection)
    {
       Debug.WriteLine(string.Format("{0} - {1}",cp.Name,cp.Value));
    }

    if (comp.RuntimeConnectionCollection.Count > 0)
    {
      IDTSRuntimeConnection100 rtconn = comp.RuntimeConnectionCollection[0];
      if (pkg.Connections.Contains(rtconn.ConnectionManagerID))
      {
        var conn = Package.Connections[rtconn.ConnectionManagerID];
        // Get the connection name
        varconnName = conn.Name;
      }
   }
 }

检索从MSDN获取的 MainPipes 连接的示例

于 2016-07-27T23:22:37.533 回答