Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

445
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda