Столбцы списка в подключении к плоскому файлу служб SSIS
Я пытаюсь создать документ спецификации столбца "начало / длина" из пакета служб 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"];
1 ответ
ОБНОВЛЕНИЕ: Хорошо, ответ ниже кажется неуместным в этом контексте (хотя все еще полезно в некотором смысле, поэтому я оставлю это). Мне не удалось учесть, что в Flat File ConnectionManager есть доступные столбцы, вместо того, чтобы проходить через компонент источника / назначения с столбцами вывода / ввода
Значение (GetValue) свойства Columns должно быть приведено к IDTSConnectionManagerFlatFileColumns100 (или 90, если вы используете API-интерфейс SQL Server 2005)
В качестве альтернативы, приведите InnerObject вашего менеджера конфигурации к IDTSConnectionManagerFlatFile100, который предоставляет свойство Columns.
(Эти интерфейсы можно найти в Microsoft.SqlServer.Dts.Runtime.Wrapper)
Не уверен, насколько это актуально для вашего контекста, и если вам все еще требуется это, но я просто сделал нечто подобное, поэтому я решил поделиться:
В приведенном ниже коде будут перечислены все столбцы файла Excel 2007 путем создания пакета служб SSIS на лету (вам нужно будет сослаться на Microsoft.SqlServer.DTSPipelineWrap, Microsoft.SqlServer.DTSRuntimeWrap, Microsoft.SQLServer.ManagedDTS и Microsoft.SqlServer.PipelineHost).
Насколько я вижу, единственное отличие состоит в том, что вам нужно будет объединить загруженный пакет, чтобы получить задачу DataFlow и соответствующий компонент назначения плоских файлов с его диспетчером соединений (в моем случае я сам создал соответствующие объекты) и получить его Входные столбцы, а не выходные столбцы.
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();
}
}
}