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();
}
}
}
Wow, parler de noms de coulée et objets intuitifs! – ProfK