Question

Je suis en train de produire une colonne document de spécification « start / longueur » d'un package SSIS qui exporte une table de base de données dans un fichier plat. Je l'ai touché quelque chose d'un mur de briques à obtenir la propriété de l'objet Columns ConnectionManager qui gère la connexion de fichier plat. Je suis en mesure d'obtenir la propriété Columns, mais je ne peux rien faire avec elle, comme je ne peux pas déterminer tout type de jeter à. Si je l'ai jeté à DTSProperty, je reçois très peu de propriétés utiles sur l'objet. Si je reçois la propriété comme object, tout ce que je peux déterminer est qu'il est un System.__ComObject.

Comment puis-je récupérer la propriété Columns comme un objet utile, je l'espère une collection, que je peux itérer?

Exemple de code:

        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"];
Était-ce utile?

La solution

UPDATE : Ok la réponse ci-dessous semble comme il est hors de propos dans ce contexte (mais toujours utile dans un certain sens, donc je vais le laisser). J'omis de considérer que le ConnectionManager de fichier plat a les colonnes disponibles plutôt que d'avoir à passer par un composant source / destination avec des colonnes de sortie / entrée

La valeur (GetValue) de la propriété Columns doit être jeté à IDTSConnectionManagerFlatFileColumns100 (ou 90 si vous utilisez l'API SQL Server 2005)

Vous pouvez également jeter le InnerObject de votre gestionnaire de configuration IDTSConnectionManagerFlatFile100 qui expose une propriété Columns.

(Ces interfaces peuvent être trouvées dans Microsoft.SqlServer.Dts.Runtime.Wrapper)


Je ne sais pas la pertinence de c'est à votre contexte et si vous avez encore besoin, mais je viens de faire quelque chose de similaire, donc je pensais que je devais partager:

Le code ci-dessous la liste de toutes les colonnes d'un fichier Excel 2007, en construisant un package SSIS à la volée (Vous aurez besoin de faire référence Microsoft.SqlServer.DTSPipelineWrap, Microsoft.SqlServer.DTSRuntimeWrap, et Microsoft.SqlServer.ManagedDTS Microsoft.SqlServer.PipelineHost).

Pour autant que je peux voir, la seule différence est que vous auriez à interogate votre package chargé pour obtenir la tâche Dataflow et composant fichier plat de destination concerné avec son gestionnaire de connexion (dans mon cas, j'ai créé moi-même les objets pertinents) et obtenir ses colonnes d'entrée plutôt que des colonnes de sortie.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top