2

DB テーブルをフラット ファイルにエクスポートする SSIS パッケージから、列 'start/length' 仕様ドキュメントを作成しようとしています。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"];
4

1 に答える 1

2

更新: 以下の回答は、このコンテキストでは無関係のようです (ただし、ある意味ではまだ有用なので、そのままにしておきます)。出力/入力列を持つソース/宛先コンポーネントを経由するのではなく、フラット ファイル ConnectionManager に使用可能な列があることを考慮できませんでした

Columns プロパティの値 (GetValue) は、IDTSConnectionManagerFlatFileColumns100 (SQL Server 2005 API を使用している場合は 90) にキャストする必要があります。

または、構成マネージャーの InnerObject を、Columns プロパティを公開する IDTSConnectionManagerFlatFile100 にキャストします。

(これらのインターフェイスは Microsoft.SqlServer.Dts.Runtime.Wrapper にあります)


これがあなたのコンテキストにどの程度関連しているか、まだこれが必要かどうかはわかりませんが、私は似たようなことをしたので、共有したいと思いました:

以下のコードは、オンザフライで SSIS パッケージをビルドすることにより、Excel 2007 ファイルのすべての列を一覧表示します (Microsoft.SqlServer.DTSPipelineWrap、Microsoft.SqlServer.DTSRuntimeWrap、Microsoft.SQLServer.ManagedDTS、および Microsoft.SqlServer を参照する必要があります)。 .PipelineHost)。

私が見る限り、唯一の違いは、ロードされたパッケージを調べて、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();
        }
    }
}

于 2010-01-20T13:37:34.667 に答える