次の方法で共有


プログラムによるデータ フロー コンポーネントの追加

更新 : 2006 年 7 月 17 日

データ フローを作成するには、最初にコンポーネントを追加します。次に、追加したコンポーネントを構成して相互に接続し、実行時のデータ フローを確立します。このセクションでは、データ フロー タスクへのコンポーネントの追加、コンポーネントのデザイン時インスタンスの作成、およびコンポーネントの構成について説明します。コンポーネントの接続方法の詳細については、「プログラムによるデータ フロー コンポーネントの接続」を参照してください。

コンポーネントの追加

ComponentMetaDataCollection コレクションの New メソッドを呼び出して新しいコンポーネントを作成し、データ フロー タスクに追加します。このメソッドは、コンポーネントの IDTSComponentMetaData90 インターフェイスを返します。ただしこの時点で、IDTSComponentMetaData90 には、いずれか 1 つのコンポーネント固有の情報は含まれていません。ComponentClassID プロパティを設定し、コンポーネントの種類を識別します。データ フロー タスクはこのプロパティの値を使用して、実行時にコンポーネントのインスタンスを作成します。

ComponentClassID プロパティの値には、CLSID、PROGID、またはコンポーネントの CreationName プロパティを指定できます。CLSID は通常、コンポーネントの ComponentClassID プロパティの値として [プロパティ] ウィンドウに表示されます。このプロパティ、および使用できるコンポーネントの他のプロパティの取得については、「プログラムによるデータ フロー コンポーネントの検出」を参照してください。

マネージ コンポーネントの追加

CLSID または PROGID を使用して、いずれかのマネージ データ フロー コンポーネントをデータ フローに追加することはできません。これらの値はコンポーネント自体ではなく、ラッパーを指しているためです。その代わり、次のサンプルに示すように、CreationName プロパティまたは AssemblyQualifiedName プロパティを使用できます。

AssemblyQualifiedName プロパティを使用する場合は、Visual Studio プロジェクトで、マネージ コンポーネントを含んでいるアセンブリに参照を追加する必要があります。これらのアセンブリは、[参照の追加] ダイアログ ボックスの [.NET] タブに一覧表示されません。通常は、C:\Program Files\Microsoft SQL Server\90\DTS\PipelineComponents フォルダを参照してアセンブリを探す必要があります。

組み込みマネージ データ フロー コンポーネントの要素は次のとおりです。

  • ADO.Net ソース
  • XML ソース
  • DataReader 変換先
  • SQL Server 2005 Compact Edition 変換先
  • スクリプト コンポーネント

次のコード サンプルは、マネージ コンポーネントをデータ フローに追加するための 2 つの方法を示しています。

using System;
using Microsoft.SqlServer.Dts.Runtime;
using Microsoft.SqlServer.Dts.Pipeline;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;

namespace Microsoft.SqlServer.Dts.Samples
{
  class Program
  {
    static void Main(string[] args)
    {
      Microsoft.SqlServer.Dts.Runtime.Package package = new Microsoft.SqlServer.Dts.Runtime.Package();
      Executable e = package.Executables.Add("DTS.Pipeline.1");
      Microsoft.SqlServer.Dts.Runtime.TaskHost thMainPipe = (Microsoft.SqlServer.Dts.Runtime.TaskHost)e;
      MainPipe dataFlowTask = (MainPipe)thMainPipe.InnerObject;

      // The Application object will be used to obtain the CreationName
      //  of a PipelineComponentInfo from its PipelineComponentInfos collection.
      Application app = new Application();

      // Add a first ADO.Net source to the data flow.
      //  The CreationName property requires an Application instance.
      IDTSComponentMetaData90 component1 = dataFlowTask.ComponentMetaDataCollection.New();
      component1.Name = "DataReader Source";
      component1.ComponentClassID = app.PipelineComponentInfos["DataReader Source"].CreationName;

      // Add a second ADO.Net source to the data flow.
      //  The AssemblyQualifiedName property requires a reference to the assembly.
      IDTSComponentMetaData90 component2 = dataFlowTask.ComponentMetaDataCollection.New();
      component2.Name = "DataReader Source";
      component2.ComponentClassID = typeof(Microsoft.SqlServer.Dts.Pipeline.DataReaderSourceAdapter).AssemblyQualifiedName;
    }
  }
}
Imports Microsoft.SqlServer.Dts.Runtime
Imports Microsoft.SqlServer.Dts.Pipeline
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper

Module Module1

  Sub Main()

    Dim package As Microsoft.SqlServer.Dts.Runtime.Package = _
      New Microsoft.SqlServer.Dts.Runtime.Package()
    Dim e As Executable = package.Executables.Add("DTS.Pipeline.1")
    Dim thMainPipe As Microsoft.SqlServer.Dts.Runtime.TaskHost = _
      CType(e, Microsoft.SqlServer.Dts.Runtime.TaskHost)
    Dim dataFlowTask As MainPipe = CType(thMainPipe.InnerObject, MainPipe)

    ' The Application object will be used to obtain the CreationName
    '  of a PipelineComponentInfo from its PipelineComponentInfos collection.
    Dim app As New Application()

    ' Add a first ADO.Net source to the data flow.
    '  The CreationName property requires an Application instance.
    Dim component1 As IDTSComponentMetaData90 = _
      dataFlowTask.ComponentMetaDataCollection.New()
    component1.Name = "DataReader Source"
    component1.ComponentClassID = app.PipelineComponentInfos("DataReader Source").CreationName

    ' Add a second ADO.Net source to the data flow.
    '  The AssemblyQualifiedName property requires a reference to the assembly.
    Dim component2 As IDTSComponentMetaData90 = _
      dataFlowTask.ComponentMetaDataCollection.New()
    component2.Name = "DataReader Source"
    component2.ComponentClassID = _
      GetType(Microsoft.SqlServer.Dts.Pipeline.DataReaderSourceAdapter).AssemblyQualifiedName

  End Sub

End Module

コンポーネントのデザイン時インスタンスの作成

Instantiate メソッドを呼び出し、ComponentClassID プロパティによって識別される、コンポーネントのデザイン時インスタンスを作成します。このメソッドは、IDTSDesigntimeComponent90 インターフェイスのマネージ ラッパーである CManagedComponentWrapper オブジェクトを返します。

可能な限り、コンポーネントのメタデータを直接変更するのではなく、必ずデザイン時インスタンスのメソッドを使用して、コンポーネントを変更する必要があります。メタデータには、接続など、直接設定する必要のあるアイテムがありますが、メタデータを直接変更すると、コンポーネントが変更を監視および検証する機能がバイパスされるため、一般的にはお勧めしません。

接続の割り当て

OLE DB ソース コンポーネントなどの一部のコンポーネントは外部データに接続する必要があるため、パッケージ内にある既存の ConnectionManager オブジェクトをこの目的で使用します。RuntimeConnectionCollection コレクションの Count プロパティは、コンポーネントが必要とする、実行時の ConnectionManager オブジェクトの数を示します。この数が 0 より大きい場合、コンポーネントには接続が必要です。RuntimeConnectionCollection の最初の接続の ConnectionManager および Name プロパティを指定して、パッケージの接続マネージャをコンポーネントに割り当てます。実行時の接続コレクション内にある接続マネージャの名前は、パッケージから参照される接続マネージャの名前と一致する必要があります。

カスタム プロパティの値の設定

コンポーネントのデザイン時インスタンスを作成したら、ProvideComponentProperties メソッドを呼び出します。このメソッドは、コンストラクタと同様、新しく作成されたコンポーネントのカスタム プロパティと入力および出力オブジェクトを作成することにより、そのコンポーネントを初期化します。コンポーネントがリセットされ、メタデータに加えられた以前の変更が失われるため、1 つのコンポーネントで ProvideComponentProperties を複数回呼び出さないでください。

コンポーネントの CustomPropertyCollection には、コンポーネント固有の IDTSCustomProperty90 オブジェクトのコレクションが含まれています。オブジェクトのプロパティが常に可視である他のプログラミング モデルとは異なり、コンポーネントは ProvideComponentProperties メソッドが呼び出されたときにのみ、そのコンポーネントのカスタム プロパティのコレクションを設定します。メソッドを呼び出したら、コンポーネントのデザイン時インスタンスの SetComponentProperty メソッドを使用して、コンポーネントのカスタム プロパティに値を割り当てます。このメソッドは、カスタム プロパティを識別する名前と値のペアを受け取り、新しい値を設定します。

出力列の初期化

コンポーネントをタスクに追加して構成したら、オブジェクトの IDTSOutput90 で列のコレクションを初期化します。この手順は変換元コンポーネントに特に関連するものです。変換および変換先コンポーネントの列は、一般的に、上流コンポーネントから受け取る列に依存するため、この手順では初期化されない場合があります。

ReinitializeMetaData メソッドを呼び出し、変換元コンポーネントの出力の列を初期化します。コンポーネントは外部データ ソースに自動的には接続されないので、ReinitializeMetaData を呼び出す前に AcquireConnections メソッドを呼び出して、コンポーネントに外部データ ソースへのアクセスを提供し、列のメタデータを設定します。最後に ReleaseConnections メソッドを呼び出し、接続を解放します。

次の手順

コンポーネントを追加して構成したら、次の手順としてコンポーネント間のパスを作成します。これについては、トピック「プログラムによるデータ フロー コンポーネントの接続」で説明します。

サンプル

次のコード例は、OLE DB ソース コンポーネントをデータ フロー タスクに追加し、コンポーネントのデザイン時インスタンスを作成して、コンポーネントのプロパティを構成します。この例では、アセンブリ Microsoft.SqlServer.DTSRuntimeWrap に対する追加の参照が必要です。

using System;
using Microsoft.SqlServer.Dts.Runtime;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;
using Microsoft.SqlServer.Dts.Pipeline;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;

namespace Microsoft.SqlServer.Dts.Samples
{
  class Program
  {
    static void Main(string[] args)
    {
      Runtime.Package package = new Runtime.Package();
      Executable e = package.Executables.Add("DTS.Pipeline.1");
      Runtime.TaskHost thMainPipe = e as Runtime.TaskHost;
      MainPipe dataFlowTask = thMainPipe.InnerObject as MainPipe;
      
      // Add an OLEDB connection manager to the package.
      ConnectionManager cm = package.Connections.Add("OLEDB");
      cm.Name = "OLEDB ConnectionManager";
      cm.ConnectionString = "Data Source=(local);" + 
        "Initial Catalog=AdventureWorks;Provider=SQLOLEDB.1;" + 
        "Integrated Security=SSPI;"
      
      // Add an OLE DB source to the data flow.
      IDTSComponentMetaData90 component = 
        dataFlowTask.ComponentMetaDataCollection.New();
      component.Name = "OLEDBSource";
      component.ComponentClassID = "DTSAdapter.OleDbSource.1";
      // You can also use the CLSID of the component instead of the PROGID.
      //component.ComponentClassID = "{2C0A8BE5-1EDC-4353-A0EF-B778599C65A0}";

      // Get the design time instance of the component.
      CManagedComponentWrapper instance = component.Instantiate();

      // Initialize the component
      instance.ProvideComponentProperties();

      // Specify the connection manager.
      if (component.RuntimeConnectionCollection.Count > 0)
      {
        component.RuntimeConnectionCollection[0].ConnectionManager = 
          DtsConvert.ToConnectionManager90(package.Connections[0]);
      }

      // Set the custom properties.
      instance.SetComponentProperty("AccessMode", 2);
      instance.SetComponentProperty("SqlCommand", 
        "Select * from Production.Product");

      // Reinitialize the metadata.
      instance.AcquireConnections(null);
      instance.ReinitializeMetaData();
      instance.ReleaseConnections();

      // Add other components to the data flow and connect them.
    }
  }
}
Imports Microsoft.SqlServer.Dts.Runtime
Imports Microsoft.SqlServer.Dts.Runtime.Wrapper
Imports Microsoft.SqlServer.Dts.Pipeline
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper

Module Module1

  Sub Main()

    Dim package As Microsoft.SqlServer.Dts.Runtime.Package = _
      New Microsoft.SqlServer.Dts.Runtime.Package()
    Dim e As Executable = package.Executables.Add("DTS.Pipeline.1")
    Dim thMainPipe As Microsoft.SqlServer.Dts.Runtime.TaskHost = _
      CType(e, Microsoft.SqlServer.Dts.Runtime.TaskHost)
    Dim dataFlowTask As MainPipe = CType(thMainPipe.InnerObject, MainPipe)

    ' Add an OLEDB connection manager to the package.
    Dim cm As ConnectionManager = package.Connections.Add("OLEDB")
    cm.Name = "OLEDB ConnectionManager"
    cm.ConnectionString = "Data Source=(local);" & _
      "Initial Catalog=AdventureWorks;Provider=SQLOLEDB.1;" & _
      "Integrated Security=SSPI;"

    ' Add an OLE DB source to the data flow.
    Dim component As IDTSComponentMetaData90 = _
      dataFlowTask.ComponentMetaDataCollection.New()
    component.Name = "OLEDBSource"
    component.ComponentClassID = "DTSAdapter.OleDbSource.1"
    ' You can also use the CLSID of the component instead of the PROGID.
    'component.ComponentClassID = "{2C0A8BE5-1EDC-4353-A0EF-B778599C65A0}";

    ' Get the design time instance of the component.
    Dim instance As CManagedComponentWrapper = component.Instantiate()

    ' Initialize the component.
    instance.ProvideComponentProperties()

    ' Specify the connection manager.
    If component.RuntimeConnectionCollection.Count > 0 Then
      component.RuntimeConnectionCollection(0).ConnectionManager = _
        DtsConvert.ToConnectionManager90(package.Connections(0))
    End If

    ' Set the custom properties.
    instance.SetComponentProperty("AccessMode", 2)
    instance.SetComponentProperty("SqlCommand", _
      "Select * from Production.Product")

    ' Reinitialize the metadata.
    instance.AcquireConnections(vbNull)
    instance.ReinitializeMetaData()
    instance.ReleaseConnections()

    ' Add other components to the data flow and connect them.

  End Sub

End Module

変更履歴

リリース 履歴

2006 年 7 月 17 日

変更内容 :
  • コード例をより長いサンプルと取り替えました。
  • マネージ コンポーネントに関する新しいセクションを追加しました。

参照

概念

プログラムによるデータ フロー コンポーネントの接続

ヘルプおよび情報

SQL Server 2005 の参考資料の入手