Domanda

Sto cercando di produrre una colonna di 'start / lunghezza' documento spec da un pacchetto SSIS che esporta una tabella DB a un file flat. Ho colpito qualcosa di un muro di mattoni a ottenere la proprietà Columns dall'oggetto ConnectionManager che gestisce la connessione file flat. Sono in grado di ottenere la proprietà Columns, ma non posso fare nulla con esso, come non riesco a stabilire alcun tipo per lanciarla a. Se lancio a DTSProperty, mi sento molto poche proprietà utili per l'oggetto. Se ottengo la proprietà come object, tutto quello che posso determinare è che si tratta di un System.__ComObject.

Come faccio a recuperare la proprietà Columns come un oggetto utile, si spera una collezione, che posso iterare?

Codice di esempio:

        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"];
È stato utile?

Soluzione

Aggiorna : Ok la risposta qui sotto sembra che sia irrilevante in questo contesto (anche se ancora utile in un certo senso, quindi mi lascerò). Non sono riuscito a prendere in considerazione che il piatto ConnectionManager File ha le colonne a sua disposizione, piuttosto che dover passare attraverso un componente di origine / destinazione con colonne di uscita / ingresso

Il valore (GetValue) della proprietà Columns dovrebbe essere lanciato a IDTSConnectionManagerFlatFileColumns100 (o 90 se si sta utilizzando l'API SQL Server 2005)

In alternativa, lanciare InnerObject del manager di configurazione per IDTSConnectionManagerFlatFile100 che espone una proprietà colonne.

(Queste interfacce possono essere trovati in Microsoft.SqlServer.Dts.Runtime.Wrapper)


Non so quanto sia rilevante questo è al vostro contesto e se ancora bisogno di questo, ma ho appena fatto qualcosa di simile, così ho pensato che vorrei condividere:

Il codice di seguito elenca tutte le colonne di un file di Excel 2007, con la costruzione di un pacchetto SSIS al volo (Avrete bisogno di fare riferimento a Microsoft.SqlServer.DTSPipelineWrap, Microsoft.SqlServer.DTSRuntimeWrap, Microsoft.SqlServer.ManagedDTS e Microsoft.SqlServer.PipelineHost).

Per quanto posso vedere, l'unica differenza è che dovreste interogate il pacchetto caricato per ottenere il compito DataFlow e rilevante componente Destinazione file flat con la sua gestione connessione (nel mio caso ho creato gli oggetti rilevanti io) e ottenere le sue colonne di ingresso piuttosto che colonne di output.

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();
        }
    }
}

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top