Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何以编程方式分析数据流任务?_C#_Ssis - Fatal编程技术网

C# 如何以编程方式分析数据流任务?

C# 如何以编程方式分析数据流任务?,c#,ssis,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 (IDTSComponentM

我正在使用一个工具(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
强制转换为“数据流组件的对象”,这在很大程度上是因为没有数据流组件的对象。在幕后,SSIS是一个COM驱动的应用程序,特别是对于库存组件,而不是本机.NET应用程序。这就是为什么以编程方式创建SSIS数据流如此痛苦的部分原因。(有关更详细的讨论,请参见MSDN中的。)

也就是说,
IDTSComponentMetaData100
接口确实公开了一个
ObjectType
属性,它是一个枚举。数据流中的源将具有
对象类型
OT\u SOURCEADAPTER
、目标
OT\u DESTINATIONADAPTER
和转换
OT\u TRANSFORM


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

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

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;
      }
   }
 }

检索来自

的MainPipes连接的示例请查看本文,谢谢praveen。这就是我们可以动态创建包的方式,但我需要分析包。下面的代码将创建IDTSComponentMetaData100的ne实例作为OLEDB目标。IDTSComponentMetaData100 destComponent=pipeline.ComponentMetaDataCollection.New();destComponent.ComponentClassID=“DTSAdapter.OleDbDestination”;destComponent.ValidateExternalMetadata=true;但我需要通过数据流通过循环提取OLEDB目标。请帮忙……非常感谢@Edmund Schweppe。。。所以提取数据流组件的唯一方法是通过对包的结果xml进行分割…?因为我不知道“提取数据流组件”的确切含义,我恐怕无法回答这个问题。我主要想记录数据流的源和目标。例如:如果有XML源和OLEDB目标,我需要XSD模式位置、OLDB目标连接等…谢谢@Edmund