Estoy trabajando en la creación de un programa .NET para actualizar en masa un montón de paquetes SSIS. Tengo la mayor parte de lo que necesito (actualizar las cadenas de conexión, cambiar la versión, etc.) y lo último que quiero hacer es poder actualizar mediante programación los metadatos de la columna. Sin embargo, parece que no puedo cargar las tareas de flujo de datos existentes.
var app = new Microsoft.SqlServer.Dts.Runtime.Application(); var package = app.LoadPackage(path, null); var tasks = package.Executables.Cast<Microsoft.SqlServer.Dts.Runtime.TaskHost>().ToList(); foreach (var item in tasks) { var pipeline = item.InnerObject as Microsoft.SqlServer.Dts.Pipeline.Wrapper.Sql2016.MainPipe; if (pipeline == null) // skip sqltask, sendmailtask, etc continue; var metadata = pipeline.ComponentMetaDataCollection; // always an empty collection } El paquete particular que estoy cargando tiene varias tareas, pero cuando filtro a la que es una tarea de flujo de datos, ComponentMetaDataCollection siempre está vacío, pero esperaría dos elementos (un origen OLE DB y un destino OLE DB).
<DTS:Executable DTS:refId="Package\WORK" DTS:CreationName="Microsoft.Pipeline" DTS:Description="Data Flow Task" DTS:DTSID="{342AAB75-DE96-47E9-A253-B00B86A56F05}" DTS:ExecutableType="Microsoft.Pipeline" DTS:LocaleID="-1" DTS:ObjectName="WORK" DTS:TaskContact="Performs high-performance data extraction, transformation and loading;Microsoft Corporation; Microsoft SQL Server; (C) 2007 Microsoft Corporation; All Rights Reserved;http://www.microsoft.com/sql/support/default.asp;1"> <DTS:Variables /> <DTS:ObjectData> <pipeline version="1"> <components> <component refId="Package\WORK\OLE DB Destination" componentClassID="Microsoft.OLEDBDestination" contactInfo="OLE DB Destination;Microsoft Corporation; Microsoft SQL Server; (C) Microsoft Corporation; All Rights Reserved; http://www.microsoft.com/sql/support;4" description="OLE DB Destination" name="OLE DB Destination" usesDispositions="true" version="4"> ... edited for brevityProbé docenas de métodos en los últimos dos días para tratar de obtener los existentes para poder actualizar los metadatos. Sé que la biblioteca SqlServer.DTS está destinada más a la creación de paquetes que a la modificación de los existentes, pero ¿hay alguna forma de lograrlo? En última instancia, estoy buscando llamar a métodos como:
//foreach (IDTSComponentMetaData100 component in pipeline.ComponentMetaDataCollection) { // var wrapper = component.Instantiate(); // wrapper.ProvideComponentProperties(); // wrapper.AcquireConnections(null); // wrapper.ReinitializeMetaData(); // wrapper.ReleaseConnections(); //}por lo que puedo ahorrarme meses de actualizarlos manualmente (hay algo así como 3000 paquetes en total que necesitamos actualizar). ¡Cualquier ayuda sería muy apreciada!
Sé que la biblioteca SqlServer.DTS está destinada más a la creación de paquetes que a la modificación de los existentes.
¡¡Completamente equivocado!! ¡La automatización de paquetes SSIS no significa solo creación!
Creo que debería usar Microsoft.SqlServer.Dts.Pipeline.Wrapper.MainPipe en lugar de Microsoft.SqlServer.Dts.Pipeline.Wrapper.Sql2016.MainPipe .
Intenta usar el siguiente código:
using DtsWrapper = Microsoft.SqlServer.Dts.Pipeline.Wrapper; using DtsRuntime = Microsoft.SqlServer.Dts.Runtime; ... DtsRuntime.TaskHost TH = (DtsRuntime.TaskHost)tsk; //Data Flow Task components if (TH.InnerObject.ToString() == "System.__ComObject"){ DtsWrapper.MainPipe m = (DtsWrapper.MainPipe)TH.InnerObject; DtsWrapper.IDTSComponentMetaDataCollection100 mdc = m.ComponentMetaDataCollection; foreach (DtsWrapper.IDTSComponentMetaData100 md in mdc) { //write your logic here } }Puede obtener más información sobre el bucle de los componentes del paquete existente en la siguiente respuesta: