Listar as colunas numa ligação simples de Ficheiros SSIS

estou a tentar produzir uma coluna' start/length ' spec document a partir de um pacote SSIS que exporta uma tabela DB para um ficheiro plano. Bati numa parede de tijolos ao conseguir a propriedade do objecto ConnectionManager que trata da ligação de ficheiros planos. Eu sou capaz de obter a propriedade {[[1]}, mas eu não posso fazer nada com ela, como eu não posso determinar qualquer tipo para lançá-la. Se eu o lançar para a DTSProperty, terei muito poucas propriedades úteis no objeto. Se eu conseguir a propriedade como object, tudo o que posso determinar é que é um System.__ComObject.

Como é que recupero a propriedade das colunas como um objecto útil, Esperemos que uma colecção, que possa conter?

Código Da Amostra:

        DTSRT.Application dtap = new Application();
        DTSRT.Package pkg = dtap.LoadFromDtsServer(@"\MSDB\ExportSamples", "ERISIA", null);
        DTSRT.ConnectionManager ffcn = pkg.Connections["DestinationConnectionFlatFile"];
        DtsProperty cols = ffcn.Properties["Columns"];
Author: ProfK, 2009-09-19

1 answers

UPDATE : Ok a resposta abaixo parece ser irrelevante neste contexto (embora ainda seja útil em algum sentido, por isso vou deixá-la). Não consegui considerar que o conector de Ficheiros planos tem as colunas disponíveis em vez de ter de passar por um componente de origem / destino com as colunas de saída/entrada

O valor (GetValue) da propriedade colunas deve ser moldado para IDTSConnectionManagerFlatFileColumns100 (ou 90 se estiver a usar o servidor sql 2005 API)

Em alternativa, escolha o objectivo interno do seu gestor de configuração para o IDTSConnectionManagerFlatFile100, que expõe uma propriedade de colunas.

(estas interfaces podem ser encontradas na Microsoft.SqlServer.Dts.Execucao.Embalagem)


Não sei se isto é relevante para o seu contexto e se ainda precisa disto, mas acabei de fazer algo semelhante, então pensei em partilhar:

O código abaixo irá listar todas as colunas de um ficheiro Excel 2007, construindo um SSIS pacote on the fly (você vai precisar de referência Microsoft.SqlServer.DTSPipelineWrap, Microsoft.SqlServer.DTSRuntimeWrap, Microsoft.SQLServer.ManagedDTS e Microsoft.SqlServer.PipelineHost).

Tanto quanto eu consigo ver, a única diferença é que você teria que interogar o seu pacote carregado para obter a tarefa DataFlow e o componente de destino de Ficheiros planos relevante com o seu gestor de ligação (no meu caso, eu próprio criei os objectos relevantes) e obter as suas colunas de entrada em vez de saída coluna.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SqlServer.Dts.Runtime;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;

namespace SSISListColumns
{
    class Program
    {
        static void Main(string[] args)
        {
            // Create package
            Package package = new Package();

            // Create excel connection manager and set connection string
            string fileName = "sampledata.xlsx";
            ConnectionManager connection = package.Connections.Add("EXCEL");
            connection.Properties["ConnectionString"].SetValue(connection, string.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 12.0;HDR=YES""", fileName));

            // Add Data Flow task
            Executable e = package.Executables.Add("STOCK:PipelineTask");
            TaskHost thMainPipe = e as TaskHost;
            MainPipe dataFlowTask = thMainPipe.InnerObject as MainPipe; 

            // Add Excel Source component
            IDTSComponentMetaData100 component = dataFlowTask.ComponentMetaDataCollection.New();
            component.Name = "ExcelSource";
            component.ComponentClassID = "DTSAdapter.ExcelSource.2";

            // Set Excel Source properties (connection manager, access mode and sheet/rowset)
            CManagedComponentWrapper instance = component.Instantiate();
            instance.ProvideComponentProperties();

            if (component.RuntimeConnectionCollection.Count > 0)
            {
                component.RuntimeConnectionCollection[0].ConnectionManager = DtsConvert.GetExtendedInterface(package.Connections[0]);
                component.RuntimeConnectionCollection[0].ConnectionManagerID = package.Connections[0].ID;
            }
            instance.SetComponentProperty("AccessMode", 0);
            instance.SetComponentProperty("OpenRowset", "Sheet1$");

            // Activate
            instance.AcquireConnections(null);
            instance.ReinitializeMetaData();
            instance.ReleaseConnections();

            // List output columns
            var output = component.OutputCollection[0];
            foreach (IDTSOutputColumn100 column in output.OutputColumnCollection)
            {
                Console.WriteLine(column.Name);
            }

            Console.ReadKey();
        }
    }
}

 1
Author: Veli Gebrev, 2010-01-20 14:31:13