如何以编程方式分析Dataflow任务?

时间:2013-03-19 13:02:12

标签: c# ssis

我正在使用工具(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等数据流组​​件的某些对象?如果可能,我将如何识别来源,目的地等?

如果不可能,请提供一些实现此目的的提示。

2 个答案:

答案 0 :(得分:2)

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

也就是说,IDTSComponentMetaData100接口确实公开了ObjectType属性,这是一个DTSObjectType枚举。数据流中的来源将ObjectType OT_SOURCEADAPTER,目标OT_DESTINATIONADAPTER和转化OT_TRANSFORM

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

答案 1 :(得分:0)

在上面的Edmunds回答的基础上,您可以测试OT_SOURCEADAPTER和OT_DESTINATION对象类型,然后通过RuntimeConnectionCollection迭代自定义属性和任何链接的连接。这将允许您检索任何自定义属性值或关联的连接以及任何连接属性,例如连接名称。
下面的Psuedo代码显示自定义属性并获取源连接名称,假设您已经打开了包并且引用了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连接的示例
相关问题