2009-09-19 9 views
2

J'essaie de produire un document de spécification de colonne 'start/length' à partir d'un package SSIS qui exporte une table DB vers un fichier plat. J'ai frappé quelque chose d'un mur de briques pour obtenir la propriété Columns de l'objet 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, car je ne peux pas déterminer le type à utiliser. Si je le cast à DTSProperty, j'obtiens très peu de propriétés utiles sur l'objet. Si je reçois la propriété object, tout ce que je peux déterminer, c'est que c'est un System.__ComObject. Comment puis-je récupérer la propriété Columns en tant qu'objet utile, avec un peu de chance, une collection que je peux parcourir plus d'une fois?Colonnes de liste dans une connexion de fichier plat SSIS

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"]; 

Répondre

1

MISE À JOUR: 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). Je n'ai pas considéré que le fichier FlatMan ConnectionManager disposait des colonnes plutôt que de devoir passer par un composant source/destination avec des colonnes de sortie/entrée

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

Vous pouvez également convertir l'objet InnerObject de votre gestionnaire de configuration en IDTSConnectionManagerFlatFile100, ce qui expose une propriété Columns.

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


Je ne sais pas comment cela est à votre contexte pertinent et si vous avez encore besoin, mais je viens de faire quelque chose similaire, donc je pensais que je partagerais:

Le code ci-dessous liste toutes les colonnes d'un fichier Excel 2007, en construisant un paquet SSIS à la volée (Vous aurez besoin de faire référence à Microsoft.SqlServer.DTSPipelineWrap, Microsoft .SqlServer.DTSRuntimeWrap, Microsoft.SQLServer.ManagedDTS et Microsoft.SqlServer.PipelineHost). Pour autant que je puisse voir, la seule différence est que vous devez interoguer votre paquet chargé pour obtenir la tâche DataFlow et le composant de destination de fichier plat approprié avec son gestionnaire de connexion (dans mon cas, j'ai créé les objets pertinents moi-même) 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(); 
     } 
    } 
} 

+0

Wow, parler de noms de coulée et objets intuitifs! – ProfK