//would expect that PathCollection.FindObjectByID would do this, but it appears to throw an exception if not found private static bool ContainsID(IDTSPathCollectionXX paths, int ID) { foreach (IDTSPathXX path in paths) { if (path.ID == ID) return true; } return false; }
private static IDTSPathXX GetPathForInput(IDTSInputXX input, IDTSPathCollectionXX paths) { foreach (IDTSPathXX path in paths) { if (path.EndPoint.ID == input.ID) return path; } return null; }
private static IDTSComponentMetaDataXX[] GetUpstreamComponents(IDTSComponentMetaDataXX component, IDTSPathCollectionXX paths) { List<IDTSComponentMetaDataXX> componentsToReturn = new List<IDTSComponentMetaDataXX>(); foreach (IDTSPathXX upstream in paths) { if (upstream.EndPoint.Component.ID == component.ID) { if (!componentsToReturn.Contains(upstream.StartPoint.Component)) { componentsToReturn.Add(upstream.StartPoint.Component); componentsToReturn.AddRange(GetUpstreamComponents(upstream.StartPoint.Component, paths)); } } } return componentsToReturn.ToArray(); }
//workaround to http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=3161935&SiteID=1 private static void RemovePath(IDTSPathXX path, IDTSPathCollectionXX paths, bool AllowDeleteStartPoint) { if (!AllowDeleteStartPoint && path.StartPoint.DeleteOutputOnPathDetached) { System.Diagnostics.Debug.WriteLine("path going to delete output after detached!"); path.StartPoint.DeleteOutputOnPathDetached = false; } bool bSuccess = false; try { paths.RemoveObjectByID(path.ID); bSuccess = true; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine("Caught error during RemovePath: " + ex.Message); if (!ContainsID(paths, path.ID)) bSuccess = true; } if (!bSuccess) throw new Exception("Could not remove path"); }