Список столбцов в соединении SSIS с плоским файлом

StackOverflow https://stackoverflow.com/questions/1448287

Вопрос

Я пытаюсь создать документ спецификации столбца 'start / length' из пакета SSIS, который экспортирует таблицу базы данных в плоский файл.Я натолкнулся на что-то вроде кирпичной стены в получении Columns свойство из объекта ConnectionManager, который обрабатывает соединение с плоским файлом.Я в состоянии получить Columns свойство, но я ничего не могу с ним сделать, так как я не могу определить какой тип для его приведения.Если я приведу его к DTSProperty, я получу очень мало полезных свойств объекта.Если я получу собственность как object, все , что я могу определить , это то , что это System.__ComObject.

Как мне извлечь свойство Columns как полезный объект, надеюсь, коллекцию, по которой я могу выполнять итерации?

Пример кода:

        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"];
Это было полезно?

Решение

Обновить:Хорошо, приведенный ниже ответ кажется неуместным в данном контексте (хотя в некотором смысле все еще полезен, поэтому я оставлю его).Я не учел, что плоский файл ConnectionManager имеет доступные ему столбцы вместо того, чтобы проходить через компонент источника / назначения со столбцами вывода / ввода

Значение (GetValue) свойства Columns должно быть приведено к IDTSConnectionManagerFlatFileColumns100 (или 90, если вы используете SQL Server 2005 API).

В качестве альтернативы, приведите InnerObject вашего configuration manager к IDTSConnectionManagerFlatFile100, который предоставляет свойство Columns.

(Эти интерфейсы можно найти в Microsoft.SQLServer.Dts.Runtime.Оболочка)


Не уверен, насколько это актуально для вашего контекста и требуется ли вам это по-прежнему, но я только что сделал нечто подобное, поэтому решил поделиться:

Приведенный ниже код выведет список всех столбцов файла Excel 2007 путем создания пакета SSIS "на лету" (вам нужно будет обратиться к Microsoft.SQLServer.DTSPipelineWrap, Microsoft.SQLServer.DTSRuntimeWrap, Microsoft.SQLServer.ManagedDTS и Microsoft.SQLServer.Конвейерный узел).

Насколько я могу видеть, единственное отличие заключается в том, что вам пришлось бы взаимодействовать с загруженным пакетом, чтобы получить задачу потока данных и соответствующий компонент назначения плоского файла с его диспетчером подключений (в моем случае я сам создал соответствующие объекты) и получить его входные столбцы, а не выходные столбцы.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top