列出SSIS平面文件连接中的列

时间:2009-09-19 10:23:45

标签: .net interop ssis com-interop dts

我正在尝试从SSIS包中生成列'start / length'规范文档,该文档将DB表导出到平面文件。从ConnectionManager对象获取处理平面文件连接的Columns属性时,我遇到了一些问题。我能够获得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 个答案:

答案 0 :(得分:1)

更新:好的,下面的答案似乎在这种情况下无关紧要(虽然在某种意义上仍然有用,所以我会留下它)。我没有考虑到Flat File ConnectionManager有可用的列,而不必通过带有输出/输入列的源/目标组件

Columns属性的值(GetValue)应该转换为IDTSConnectionManagerFlatFileColumns100(如果您使用的是SQL Server 2005 API,则为90)

或者,将配置管理器的InnerObject强制转换为暴露Columns属性的IDTSConnectionManagerFlatFile100。

(这些接口可以在Microsoft.SqlServer.Dts.Runtime.Wrapper中找到)


不确定这与你的背景有多相关,如果你仍然需要这个,但我只是做了类似的事情,所以我想我会分享:

下面的代码将列出Excel 2007文件的所有列,方法是动态构建一个SSIS包(您需要引用Microsoft.SqlServer.DTSPipelineWrap,Microsoft.SqlServer.DTSRuntimeWrap,Microsoft.SQLServer.ManagedDTS和Microsoft.SqlServer.PipelineHost)。

据我所知,唯一的区别是你必须通过interogate加载包来获取DataFlow任务和相关的Flat File Destination组件及其连接管理器(在我的例子中,我自己创建了相关的对象)并获取其输入列而不是输出列。

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

<击>