【问题标题】:How to analyze Dataflow task programmatically?如何以编程方式分析数据流任务?
【发布时间】:2013-03-19 13:02:11
【问题描述】:

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

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

【问题讨论】:

  • 谢谢普拉文。这就是我们可以动态创建包的方式,但我需要分析包。下面的代码将创建一个 IDTSComponentMetaData100 的实例作为 OleDbDestination。 IDTSComponentMetaData100 destComponent = pipeline.ComponentMetaDataCollection.New(); destComponent.ComponentClassID = "DTSAdapter.OleDbDestination"; destComponent.ValidateExternalMetadata = true;但我需要通过数据流循环提取 OleDbDestination。请帮忙...

标签: c# ssis


【解决方案1】:

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

也就是说,IDTSComponentMetaData100 接口确实公开了一个ObjectType 属性,它是一个DTSObjectType 枚举。数据流中的源将具有ObjectTypeOT_SOURCEADAPTER、目标OT_DESTINATIONADAPTER 和转换OT_TRANSFORM

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

【讨论】:

  • 非常感谢@Edmund Schweppe...所以提取数据流组件的唯一方法是解析包的结果xml...??
  • 由于我不知道您所说的“提取数据流组件”究竟是什么意思,恐怕我无法回答这个问题。
  • 主要是想记录数据流的来源和目的地。例如:如果有 XML 源和 OLEDB 目标,我需要 XSD 架构位置、OLDB 目标连接等...谢谢@Edmund
【解决方案2】:

基于 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 连接的示例

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    相关资源
    最近更新 更多