{"id":281,"date":"2015-01-04T19:50:56","date_gmt":"2015-01-04T18:50:56","guid":{"rendered":"http:\/\/www.csopro.de\/biblog\/?p=281"},"modified":"2015-06-14T14:03:09","modified_gmt":"2015-06-14T13:03:09","slug":"quarantneteil-1-schleife-ber-alle-data-flows","status":"publish","type":"post","link":"https:\/\/www.csopro.de\/biblog\/2015\/01\/quarantneteil-1-schleife-ber-alle-data-flows\/","title":{"rendered":"Quarant&auml;ne&ndash;Teil 1: Schleife &uuml;ber alle Data Flows"},"content":{"rendered":"<p>In einem vorangegangenen Eintrag hatte ich die Idee der Quarant\u00e4ne vorgestellt, f\u00fcr die wir ein VB-Programm geschrieben haben, das in einem SSIS-Paket das Fehlerhandling umstellt.<\/p>\n<h1><\/h1>\n<h1>DLLs einbinden<\/h1>\n<p>Als erstes m\u00fcssen wir die folgenden DLLs einbinden:<\/p>\n<p><a href=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2015\/01\/image.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;\" title=\"image\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2015\/01\/image_thumb.png\" alt=\"image\" width=\"644\" height=\"54\" border=\"0\" \/><\/a><\/p>\n<p>also:<\/p>\n<ul>\n<li>Microsoft.SqlServer.DTSPipelineWrap<\/li>\n<li>Microsoft.SqlServer.DTSRuntimeWrap<\/li>\n<li>Microsoft.SqlServer.ManagedDTS<\/li>\n<\/ul>\n<p>Diese m\u00fcssen dann mit Imports (VB) bzw. using (c#) eingebunden werden \u2013 hier immer die VB-Beispiele:<\/p>\n<p><em>Imports System<br \/>\nImports Microsoft.SqlServer.Dts.Runtime<br \/>\nImports Microsoft.SqlServer.Dts.Pipeline.Wrapper<br \/>\nImports System.Runtime.InteropServices<\/em><\/p>\n<h1><\/h1>\n<h1>Paket laden<\/h1>\n<p>Als erstes wollen wir das SSIS-Paket laden und wieder speichern:<\/p>\n<p><em>Dim ssisApp As New Microsoft.SqlServer.Dts.Runtime.Application<br \/>\nDim pName As String = \u201cC:\\meineProjekte\\Paket.dtsx\u201d<br \/>\nDim package As New Package<br \/>\npackage = ssisApp.LoadPackage(pName, Nothing)<br \/>\nssisApp.SaveToXml(\u201cneuerName.dtsx\u201d, package, Nothing)<\/em><\/p>\n<h1>Alle Tasks ermitteln<\/h1>\n<p>Nun wollen wir in dem SSIS-Paket alle Tasks durchlaufen, um sie ver\u00e4ndern zu k\u00f6nnen. Dazu enth\u00e4lt das SSIS-Paket eine Property \u201cexecutables\u201d, diese enth\u00e4lt alle Tasks der ersten Ebene.<\/p>\n<p>Mit einer Schleife k\u00f6nnen wir diese durchlaufen:<\/p>\n<p><em>For Each e As Executable In package.executables<br \/>\nNext <\/em><\/p>\n<p>Allerdings erreichen wir dabei nur die Tasks der ersten Ebene.<\/p>\n<p>In SSIS gibt es aber Tasks, die selber wieder Tasks beinhalten:<\/p>\n<ul>\n<li>Sequence<\/li>\n<li>For Each Loop<\/li>\n<li>For Loop<\/li>\n<\/ul>\n<p>Diese interne Struktur kann man einfach in der SSIS-Umgebung anhand des Package Explorers sehen. In meinem Beispiel habe ich eine Sequence mit 2 Data Flows\u00a0 und nach der Sequence noch einen Data Flow (namens \u201cskript\u201d):<\/p>\n<p><a href=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2015\/01\/image1.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;\" title=\"image\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2015\/01\/image_thumb1.png\" alt=\"image\" width=\"644\" height=\"413\" border=\"0\" \/><\/a><\/p>\n<p>Um alle Tasks durchlaufen zu k\u00f6nnen, m\u00fcssen wir also rekursiv vorgehen:<\/p>\n<p>im Hauptprogramm:<\/p>\n<p>\u2026<br \/>\n<em>processAllExecutables(package.Executables, 1)<\/em><br \/>\n\u2026<\/p>\n<p>und dann als eigene Methode:<\/p>\n<p><em>Private Sub processAllExecutables(<br \/>\nByVal executables As Executables,<br \/>\nByVal depth As Integer)<\/em><\/p>\n<p>For Each e As Executable In executables<br \/>\n\u2026<br \/>\nDim d1 As Integer = depth + 1<br \/>\nIf TypeOf e Is ForLoop Then<br \/>\nprocessAllExecutables(CType(e, ForLoop).Executables, d1)<br \/>\nEnd If<br \/>\nIf TypeOf e Is Sequence Then<br \/>\nprocessAllExecutables(CType(e, Sequence).Executables, d1)<br \/>\nEnd If<br \/>\nIf TypeOf e Is ForEachLoop Then<br \/>\nprocessAllExecutables(CType(e, ForEachLoop).Executables, d1)<br \/>\nEnd If<br \/>\nNext<br \/>\nEnd Sub<\/p>\n<p>Wie man sieht, kann man \u00fcber <em>TypeOf <\/em>\u2026 <em>Is &lt;&lt;Typ&gt;&gt;<\/em> abfragen, ob die Task <em>e<\/em> einen bestimmten Typ hat. Bei den oben genannten Typen rufen wir dann die selbe Methode rekursiv auf \u2013 ich habe der \u00dcbersichtlichkeit halber die Tiefe als zus\u00e4tzlichen Parameter \u00fcbergeben, auch wenn das nicht unbedingt notwendig ist.<\/p>\n<p>Somit haben wir das Ziel des heutigen Blogs fast erreicht: Wir durchlaufen alle Tasks. Als n\u00e4chstes m\u00fcssen wir Data Flows erkennen und verarbeiten.<\/p>\n<p>DataFlows werden in der SSIS-API als <em>TaskHost <\/em>bezeichnet. Deswegen k\u00f6nnen wir das so abpr\u00fcfen:<\/p>\n<p><em>If TypeOf e Is TaskHost Then<br \/>\n\u2026<br \/>\nEnd If<\/em><\/p>\n<p>Damit haben wir eine Schleife \u00fcber alle Data Flows programmiert.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In einem vorangegangenen Eintrag hatte ich die Idee der Quarant\u00e4ne vorgestellt, f\u00fcr die wir ein VB-Programm geschrieben haben, das in einem SSIS-Paket das Fehlerhandling umstellt. DLLs einbinden Als erstes m\u00fcssen wir die folgenden DLLs einbinden: also: Microsoft.SqlServer.DTSPipelineWrap Microsoft.SqlServer.DTSRuntimeWrap Microsoft.SqlServer.ManagedDTS Diese m\u00fcssen dann mit Imports (VB) bzw. using (c#) eingebunden werden \u2013 hier immer die VB-Beispiele: &hellip; <a href=\"https:\/\/www.csopro.de\/biblog\/2015\/01\/quarantneteil-1-schleife-ber-alle-data-flows\/\" class=\"more-link\"><span class=\"screen-reader-text\">Quarant&auml;ne&ndash;Teil 1: Schleife &uuml;ber alle Data Flows<\/span> weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10,38],"tags":[27,19],"class_list":["post-281","post","type-post","status-publish","format-standard","hentry","category-integrationservices","category-visualbasicdotnet","tag-data-flow","tag-quarantaene"],"_links":{"self":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/281","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/comments?post=281"}],"version-history":[{"count":2,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/281\/revisions"}],"predecessor-version":[{"id":338,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/281\/revisions\/338"}],"wp:attachment":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/media?parent=281"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/categories?post=281"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/tags?post=281"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}