Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

443
Views
SSIS SqlServer 2016 DTS ComponentMetaDataCollection siempre vacío

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 brevity

Probé 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!

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

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:

  • Paquete SSIS de ingeniería inversa usando C#
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!