我正在使用工具(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等数据流组件的某些对象?如果可能,我将如何识别来源,目的地等?
如果不可能,请提供一些实现此目的的提示。
答案 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连接的示例