如何使用 SSIS API 读取包并从代码中确定任务顺序 (PrecedenceConstraints)

How to use SSIS API to read a package and determine task sequence from code (PrecedenceConstraints)

我正在编写一个程序,它使用 Microsoft.SqlServer.Dts.Runtime 库从 XML 加载一个包。目前,我正在提取所有连接和任务,但我目前没有捕获优先顺序。

我使用以下简短的调试片段来绕过看起来包含此信息的对象和属性

public void Scan(string tempPath)
    {    
        XmlDocument packageXml = new XmlDocument();
        packageXml.Load(tempPath);
        IDTSEvents events = new SsisEventSupport();
        package = new Microsoft.SqlServer.Dts.Runtime.Package { PackagePassword = this.packagePassword };
        package.LoadFromXML(packageXml, events);

        foreach (var precedenceConstraint in package.PrecedenceConstraints)
        {
            //precedenceConstraint.;
            Microsoft.SqlServer.Dts.Runtime.TaskHost constrainedExecutable = (Microsoft.SqlServer.Dts.Runtime.TaskHost)precedenceConstraint.ConstrainedExecutable;
            string taskName = constrainedExecutable.Name;
            string taskId = constrainedExecutable.ID;
            string precedenceConstraintId = precedenceConstraint.ID;

            Microsoft.SqlServer.Dts.Tasks.ExecuteSQLTask.ExecuteSQLTask executeSqlTask = (Microsoft.SqlServer.Dts.Tasks.ExecuteSQLTask.ExecuteSQLTask)constrainedExecutable.InnerObject;

        }

constrainedExecutable.ID 正在为我提供受约束对象的 ID,但 我无法找出对其进行约束的对象的 ID! precedenceConstraint.ID 是约束本身的 ID,而不是约束由 constrainedExecutable.ID 标识的对象的 ID。

我找了又找,但似乎找不到。如果您需要示例,我创建了一个简单的程序包,其中包含 3 个没有连接的执行 SQL 任务。执行流程如下:

Perform  1 => Do Step 2 => Another Step

我打开了 SQL 2008 dtsx 文件并清理了文件,主要留下了相关的 xml。在第一个示例中,"Perform Step 1" 和 "Do Step 2" 之间的第一个 SSIS 约束 IDE 箭头的 ID 为 9726771C-E514-4D2D-B586-BC49D82A944E (precedenceConstraint.ID),ID arrow/precident 本身。 constrainedExecutable.ID的值为受限任务的ID,"Do Step 2",06B8BB21-5604-4A62-BD2F-9BBA7D1CA1ED。查看XML,知道前一个任务的ID是AEFFD93C-4C6D-4388-9FD5-603F6608A76C},第一个任务的ID,"Perform 1",但是如何从代码中获取此 ID 的值?

  <DTS:Executable DTS:ExecutableType="Microsoft.SqlServer.Dts.Tasks.ExecuteSQLTask.ExecuteSQLTask, Microsoft.SqlServer.SQLTask, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" DTS:ThreadHint="0">
  <DTS:Property DTS:Name="TaskContact">Execute SQL Task; Microsoft Corporation; Microsoft SQL Server 2008 R2; © 2007 Microsoft Corporation; All Rights Reserved;http://www.microsoft.com/sql/support/default.asp;1</DTS:Property> 

  <DTS:Property DTS:Name="ObjectName">Perform 1</DTS:Property> 
  <DTS:Property DTS:Name="DTSID">{AEFFD93C-4C6D-4388-9FD5-603F6608A76C}</DTS:Property> 
  <DTS:Property DTS:Name="Description">Execute SQL Task</DTS:Property> 

    <DTS:ObjectData>
        <SQLTask:SqlTaskData SQLTask:Connection="" SQLTask:TimeOut="0" SQLTask:IsStoredProc="False" SQLTask:BypassPrepare="True" SQLTask:SqlStmtSourceType="DirectInput" SQLTask:SqlStatementSource="" SQLTask:CodePage="1252" SQLTask:ResultType="ResultSetType_None" xmlns:SQLTask="www.microsoft.com/sqlserver/dts/tasks/sqltask" /> 
    </DTS:ObjectData>  
  </DTS:Executable>


 <DTS:Executable DTS:ExecutableType="Microsoft.SqlServer.Dts.Tasks.ExecuteSQLTask.ExecuteSQLTask, Microsoft.SqlServer.SQLTask, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" DTS:ThreadHint="0">
  <DTS:Property DTS:Name="LoggingMode">0</DTS:Property> 
  <DTS:Property DTS:Name="FilterKind">1</DTS:Property> 
  <DTS:Property DTS:Name="EventFilter" DTS:DataType="8" /> 
  </DTS:LoggingOptions>
      <DTS:Property DTS:Name="ObjectName">Do Step 2</DTS:Property> 
      <DTS:Property DTS:Name="DTSID">{06B8BB21-5604-4A62-BD2F-9BBA7D1CA1ED}</DTS:Property> 
      <DTS:Property DTS:Name="Description">Execute SQL Task</DTS:Property> 

     <DTS:ObjectData>
      <SQLTask:SqlTaskData SQLTask:Connection="" SQLTask:TimeOut="0" SQLTask:IsStoredProc="False" SQLTask:BypassPrepare="True" SQLTask:SqlStmtSourceType="DirectInput" SQLTask:SqlStatementSource="" SQLTask:CodePage="1252" SQLTask:ResultType="ResultSetType_None" xmlns:SQLTask="www.microsoft.com/sqlserver/dts/tasks/sqltask" /> 
     </DTS:ObjectData>

</DTS:Executable>

- <DTS:Executable DTS:ExecutableType="Microsoft.SqlServer.Dts.Tasks.ExecuteSQLTask.ExecuteSQLTask, Microsoft.SqlServer.SQLTask, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" DTS:ThreadHint="0">
  <DTS:Property DTS:Name="ExecutionLocation">0</DTS:Property> 
  <DTS:Property DTS:Name="ExecutionAddress" /> 
  <DTS:Property DTS:Name="TaskContact">Execute SQL Task; Microsoft Corporation; Microsoft SQL Server 2008 R2; © 2007 Microsoft Corporation; All Rights Reserved;http://www.microsoft.com/sql/support/default.asp;1</DTS:Property> 

  <DTS:Property DTS:Name="ObjectName">Another Step</DTS:Property> 
  <DTS:Property DTS:Name="DTSID">{2B89143B-4828-4AFA-9B5A-FAE0DB17880B}</DTS:Property> 
  <DTS:Property DTS:Name="Description">Execute SQL Task</DTS:Property>   
 <DTS:ObjectData>
  <SQLTask:SqlTaskData SQLTask:Connection="" SQLTask:TimeOut="0" SQLTask:IsStoredProc="False" SQLTask:BypassPrepare="True" SQLTask:SqlStmtSourceType="DirectInput" SQLTask:SqlStatementSource="" SQLTask:CodePage="1252" SQLTask:ResultType="ResultSetType_None" xmlns:SQLTask="www.microsoft.com/sqlserver/dts/tasks/sqltask" /> 
  </DTS:ObjectData>
  </DTS:Executable>

- <DTS:PrecedenceConstraint>
  <DTS:Property DTS:Name="Value">0</DTS:Property> 
  <DTS:Property DTS:Name="EvalOp">2</DTS:Property> 
  <DTS:Property DTS:Name="LogicalAnd">-1</DTS:Property> 
  <DTS:Property DTS:Name="Expression" /> 
  <DTS:Executable IDREF="{AEFFD93C-4C6D-4388-9FD5-603F6608A76C}" DTS:IsFrom="-1" /> 
  <DTS:Executable IDREF="{06B8BB21-5604-4A62-BD2F-9BBA7D1CA1ED}" DTS:IsFrom="0" /> 
  <DTS:Property DTS:Name="ObjectName">Constraint</DTS:Property> 
  <DTS:Property DTS:Name="DTSID">{9726771C-E514-4D2D-B586-BC49D82A944E}</DTS:Property> 
  <DTS:Property DTS:Name="Description" /> 
  <DTS:Property DTS:Name="CreationName" /> 
  </DTS:PrecedenceConstraint>
- <DTS:PrecedenceConstraint>
  <DTS:Property DTS:Name="Value">0</DTS:Property> 
  <DTS:Property DTS:Name="EvalOp">2</DTS:Property> 
  <DTS:Property DTS:Name="LogicalAnd">-1</DTS:Property> 
  <DTS:Property DTS:Name="Expression" /> 
  <DTS:Executable IDREF="{06B8BB21-5604-4A62-BD2F-9BBA7D1CA1ED}" DTS:IsFrom="-1" /> 
  <DTS:Executable IDREF="{2B89143B-4828-4AFA-9B5A-FAE0DB17880B}" DTS:IsFrom="0" /> 
  <DTS:Property DTS:Name="ObjectName">Constraint 1</DTS:Property> 
  <DTS:Property DTS:Name="DTSID">{42D509E8-4856-491B-A1D7-A30E4AA82B77}</DTS:Property> 
  <DTS:Property DTS:Name="Description" /> 
  <DTS:Property DTS:Name="CreationName" /> 
  </DTS:PrecedenceConstraint>
  <DTS:Property DTS:Name="ObjectName">Package1</DTS:Property> 
  <DTS:Property DTS:Name="DTSID">{D0AC46B8-4D38-41AB-830F-93E195B5300D}</DTS:Property> 
  <DTS:Property DTS:Name="Description" /> 
  <DTS:Property DTS:Name="CreationName">SSIS.Package.2</DTS:Property> 
  <DTS:Property DTS:Name="DisableEventHandlers">0</DTS:Property> 

  <DTS:Property DTS:Name="PackageVariableValue" DTS:DataType="8"><Package xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ddl2="http://schemas.microsoft.com/analysisservices/2003/engine/2" xmlns:ddl2_2="http://schemas.microsoft.com/analysisservices/2003/engine/2/2" xmlns:ddl100_100="http://schemas.microsoft.com/analysisservices/2008/engine/100/100" xmlns:ddl200="http://schemas.microsoft.com/analysisservices/2010/engine/200" xmlns:ddl200_200="http://schemas.microsoft.com/analysisservices/2010/engine/200/200" xmlns:dwd="http://schemas.microsoft.com/DataWarehouse/Designer/1.0"><dwd:DtsControlFlowDiagram><dwd:BoundingTop>1000</dwd:BoundingTop><dwd:Layout><dds> <diagram fontclsid="{0BE35203-8F91-11CE-9DE3-00AA004BB851}" mouseiconclsid="{0BE35204-8F91-11CE-9DE3-00AA004BB851}" defaultlayout="Microsoft.DataWarehouse.Layout.GraphLayout100" defaultlineroute="Microsoft.DataWarehouse.Layout.GraphLayout100" version="7" nextobject="14" scale="100" pagebreakanchorx="0" pagebreakanchory="0" pagebreaksizex="0" pagebreaksizey="0" scrollleft="0" scrolltop="4263" gridx="150" gridy="150" marginx="1000" marginy="1000" zoom="100" x="21616" y="8281" backcolor="15334399" defaultpersistence="2" PrintPageNumbersMode="3" PrintMarginTop="0" PrintMarginBottom="635" PrintMarginLeft="0" PrintMarginRight="0" marqueeselectionmode="1" mousepointer="0" snaptogrid="0" autotypeannotation="1" showscrollbars="0" viewpagebreaks="0" donotforceconnectorsbehindshapes="1" backpictureclsid="{00000000-0000-0000-0000-000000000000}"> <font> <ddsxmlobjectstreamwrapper binary="01010000900180380100065461686f6d61" /> </font> <mouseicon> <ddsxmlobjectstreamwrapper binary="6c74000000000000" /> </mouseicon> </diagram> <layoutmanager> <ddsxmlobj /> </layoutmanager> <ddscontrol controlprogid="DdsShapes.DdsObjectManagedBridge.2" tooltip="No connection manager is specified. " left="0" top="7654" logicalid="6" controlid="1" masterid="0" hint1="0" hint2="0" width="3598" height="1164" noresize="0" nomove="0" nodefaultattachpoints="0" autodrag="1" usedefaultiddshape="1" selectable="1" showselectionhandles="1" allownudging="1" isannotation="0" dontautolayout="0" groupcollapsed="0" tabstop="1" visible="1" snaptogrid="0"> <control> <ddsxmlobjectstreaminitwrapper binary="000800000e0e00008c040000" /> </control> <layoutobject> <ddsxmlobj> <property name="LogicalObject" value="{06B8BB21-5604-4A62-BD2F-9BBA7D1CA1ED}" vartype="8" /> <property name="ShowConnectorSource" value="0" vartype="2" /> </ddsxmlobj> </layoutobject> <shape groupshapeid="0" groupnode="0" /> </ddscontrol> <ddscontrol controlprogid="DdsShapes.DdsObjectManagedBridge.2" tooltip="No connection manager is specified. " left="978" top="5300" logicalid="7" controlid="2" masterid="0" hint1="0" hint2="0" width="3598" height="1164" noresize="0" nomove="0" nodefaultattachpoints="0" autodrag="1" usedefaultiddshape="1" selectable="1" showselectionhandles="1" allownudging="1" isannotation="0" dontautolayout="0" groupcollapsed="0" tabstop="1" visible="1" snaptogrid="0"> <control> <ddsxmlobjectstreaminitwrapper binary="000800000e0e00008c040000" /> </control> <layoutobject> <ddsxmlobj> <property name="LogicalObject" value="{AEFFD93C-4C6D-4388-9FD5-603F6608A76C}" vartype="8" /> <property name="ShowConnectorSource" value="0" vartype="2" /> </ddsxmlobj> </layoutobject> <shape groupshapeid="0" groupnode="0" /> </ddscontrol> <ddscontrol controlprogid="MSDDS.Polyline" left="1400" top="6065" logicalid="8" controlid="3" masterid="0" hint1="0" hint2="0" width="1777" height="2089" noresize="0" nomove="0" nodefaultattachpoints="1" autodrag="0" usedefaultiddshape="0" selectable="1" showselectionhandles="0" allownudging="1" isannotation="0" dontautolayout="0" groupcollapsed="0" tabstop="1" visible="1" snaptogrid="0"> <control> <ddsxmlobj> <polyline endtypedst="3" endtypesrc="1" usercolor="32768" linestyle="0" linerender="2" customendtypedstid="0" customendtypesrcid="0" adornsvisible="1" /> </ddsxmlobj> </control> <layoutobject> <ddsxmlobj> <property name="LogicalObject" value="{9726771C-E514-4D2D-B586-BC49D82A944E}" vartype="8" /> <property name="Virtual" value="0" vartype="11" /> <property name="VisibleAP" value="0" vartype="3" /> </ddsxmlobj> </layoutobject> <connector lineroutestyle="Microsoft.DataWarehouse.Layout.GraphLayout100" sourceid="2" destid="1" sourceattachpoint="7" destattachpoint="6" segmenteditmode="0" bendpointeditmode="0" bendpointvisibility="2" relatedid="0" virtual="0"> <point x="2777" y="6464" /> <point x="2777" y="7059" /> <point x="1799" y="7059" /> <point x="1799" y="7654" /> </connector> </ddscontrol> <ddscontrol controlprogid="DdsShapes.DdsObjectManagedBridge.2" tooltip="No connection manager is specified. " left="740" top="9930" logicalid="9" controlid="4" masterid="0" hint1="0" hint2="0" width="3598" height="1164" noresize="0" nomove="0" nodefaultattachpoints="0" autodrag="1" usedefaultiddshape="1" selectable="1" showselectionhandles="1" allownudging="1" isannotation="0" dontautolayout="0" groupcollapsed="0" tabstop="1" visible="1" snaptogrid="0"> <control> <ddsxmlobjectstreaminitwrapper binary="000800000e0e00008c040000" /> </control> <layoutobject> <ddsxmlobj> <property name="LogicalObject" value="{2B89143B-4828-4AFA-9B5A-FAE0DB17880B}" vartype="8" /> <property name="ShowConnectorSource" value="0" vartype="2" /> </ddsxmlobj> </layoutobject> <shape groupshapeid="0" groupnode="0" /> </ddscontrol> <ddscontrol controlprogid="MSDDS.Polyline" left="1400" top="8419" logicalid="10" controlid="5" masterid="0" hint1="0" hint2="0" width="1539" height="2011" noresize="0" nomove="0" nodefaultattachpoints="1" autodrag="0" usedefaultiddshape="0" selectable="1" showselectionhandles="0" allownudging="1" isannotation="0" dontautolayout="0" groupcollapsed="0" tabstop="1" visible="1" snaptogrid="0"> <control> <ddsxmlobj> <polyline endtypedst="3" endtypesrc="1" usercolor="32768" linestyle="0" linerender="2" customendtypedstid="0" customendtypesrcid="0" adornsvisible="1" /> </ddsxmlobj> </control> <layoutobject> <ddsxmlobj> <property name="LogicalObject" value="{42D509E8-4856-491B-A1D7-A30E4AA82B77}" vartype="8" /> <property name="Virtual" value="0" vartype="11" /> <property name="VisibleAP" value="0" vartype="3" /> </ddsxmlobj> </layoutobject> <connector lineroutestyle="Microsoft.DataWarehouse.Layout.GraphLayout100" sourceid="1" destid="4" sourceattachpoint="7" destattachpoint="6" segmenteditmode="0" bendpointeditmode="0" bendpointvisibility="2" relatedid="0" virtual="0"> <point x="1799" y="8818" /> <point x="1799" y="9374" /> <point x="2539" y="9374" /> <point x="2539" y="9930" /> </connector> </ddscontrol> </dds></dwd:Layout><dwd:PersistedViewPortTop>4263</dwd:PersistedViewPortTop></dwd:DtsControlFlowDiagram></Package></DTS:Property> 
  <DTS:Property DTS:Name="Namespace">dts-designer-1.0</DTS:Property> 
  <DTS:Property DTS:Name="ObjectName">package-diagram</DTS:Property> 
  <DTS:Property DTS:Name="DTSID">{9517A3EC-AB7A-4B57-A78B-33F2E4568DCF}</DTS:Property> 
  <DTS:Property DTS:Name="Description" /> 
  <DTS:Property DTS:Name="CreationName" /> 
  </DTS:PackageVariable>
  </DTS:Executable>

我希望我可以直接为这个提供大量赏金,因为我怀疑它会到此为止。

约束下还有另一个对象 PrecedenceExecutable,代表 "preceeding" 对象,它也有一个 ID 属性。我不确定我是怎么错过的。看来我只是需要新鲜的看一下。

    foreach (var precedenceConstraint in package.PrecedenceConstraints)
    {

        Microsoft.SqlServer.Dts.Runtime.TaskHost constrainedExecutable = (Microsoft.SqlServer.Dts.Runtime.TaskHost)precedenceConstraint.ConstrainedExecutable;
        Microsoft.SqlServer.Dts.Runtime.TaskHost precedenceExecutable = (Microsoft.SqlServer.Dts.Runtime.TaskHost)precedenceConstraint.PrecedenceExecutable;

        string taskName = constrainedExecutable.Name;

        string constrainedExecutableId = constrainedExecutable.ID;
        string precedenceConstraintId = precedenceConstraint.ID;

        Microsoft.SqlServer.Dts.Tasks.ExecuteSQLTask.ExecuteSQLTask executeSqlTask = (Microsoft.SqlServer.Dts.Tasks.ExecuteSQLTask.ExecuteSQLTask)constrainedExecutable.InnerObject;

    }