プログラムによる入力列の選択
プログラムによってコンポーネントを接続したら、変換する列または下流コンポーネントに渡す列を上流コンポーネントから選択します。コンポーネント用の入力列を選択しないと、コンポーネントはデータ フロー タスクから行を受信しません。
列の選択
GetVirtualInput メソッドを呼び出し、使用できる列の一覧を上流コンポーネントから取得します。次に、デザイン時のコンポーネント インスタンスの SetUsageType メソッドを呼び出し、仮想入力列のコレクションから列を選択します。このメソッドを呼び出すと、コンポーネントは、上流コンポーネントの出力コレクション内の対応する列と同じ系列 ID を持つ入力列を、コンポーネントの入力列のコレクション内に新しく作成します。
仮想入力オブジェクトの SetUsageType メソッドを直接呼び出して列を選択しないでください。これによって、不適切なデータ型またはその他のプロパティに基づいて、コンポーネントが列を拒否する機能がバイパスされるためです。
サンプル
次のコード例では、デザイン時のコンポーネントのインスタンスを使用して、コンポーネント用の列を選択する方法を示します。
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)
{
// Create a package and add a Data Flow task.
Package package = new Package();
Executable e = package.Executables.Add("STOCK:PipelineTask");
TaskHost thMainPipe = e as TaskHost;
MainPipe dataFlowTask = thMainPipe.InnerObject as MainPipe;
// Add an OLE DB connection manager to the package.
ConnectionManager conMgr = package.Connections.Add("OLEDB");
conMgr.ConnectionString = "Provider=SQLOLEDB.1;" +
"Data Source=<servername>;Initial Catalog=AdventureWorks;" +
"Integrated Security=SSPI;";
conMgr.Name = "SSIS Connection Manager for OLE DB";
conMgr.Description = "OLE DB connection to the AdventureWorks database.";
// Create and configure an OLE DB source component.
IDTSComponentMetaData100 source =
dataFlowTask.ComponentMetaDataCollection.New();
source.ComponentClassID = "DTSAdapter.OleDbSource";
// Create the design-time instance of the source.
CManagedComponentWrapper srcDesignTime = source.Instantiate();
// The ProvideComponentProperties method creates a default output.
srcDesignTime.ProvideComponentProperties();
// Assign the connection manager.
source.RuntimeConnectionCollection[0].ConnectionManager =
DtsConvert.GetExtendedInterface(conMgr);
// Set the custom properties of the source.
srcDesignTime.SetComponentProperty("AccessMode", 2);
srcDesignTime.SetComponentProperty("SqlCommand",
"Select * from Production.Product");
// Connect to the data source,
// and then update the metadata for the source.
srcDesignTime.AcquireConnections(null);
srcDesignTime.ReinitializeMetaData();
srcDesignTime.ReleaseConnections();
// Create and configure an OLE DB destination.
IDTSComponentMetaData100 destination =
dataFlowTask.ComponentMetaDataCollection.New();
destination.ComponentClassID = "DTSAdapter.OleDbDestination";
// Create the design-time instance of the destination.
CManagedComponentWrapper destDesignTime = destination.Instantiate();
// The ProvideComponentProperties method creates a default input.
destDesignTime.ProvideComponentProperties();
// Create the path from source to destination.
IDTSPath100 path = dataFlowTask.PathCollection.New();
path.AttachPathAndPropagateNotifications(source.OutputCollection[0],
destination.InputCollection[0]);
// Get the destination's default input and virtual input.
IDTSInput100 input = destination.InputCollection[0];
IDTSVirtualInput100 vInput = input.GetVirtualInput();
// Iterate through the virtual input column collection.
foreach (IDTSVirtualInputColumn100 vColumn in vInput.VirtualInputColumnCollection)
{
// Call the SetUsageType method of the destination
// to add each available virtual input column as an input column.
destDesignTime.SetUsageType(
input.ID, vInput, vColumn.LineageID, DTSUsageType.UT_READONLY);
}
// Verify that the columns have been added to the input.
foreach (IDTSInputColumn100 inputColumn in destination.InputCollection[0].InputColumnCollection)
Console.WriteLine(inputColumn.Name);
Console.Read();
// Add other components to the data flow and connect them.
}
}
}
Imports Microsoft.SqlServer.Dts.Runtime
Imports Microsoft.SqlServer.Dts.Pipeline
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
Module Module1
Sub Main()
' Create a package and add a Data Flow task.
Dim package As Microsoft.SqlServer.Dts.Runtime.Package = _
New Microsoft.SqlServer.Dts.Runtime.Package()
Dim e As Executable = package.Executables.Add("STOCK:PipelineTask")
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 OLE DB connection manager to the package.
Dim conMgr As ConnectionManager = package.Connections.Add("OLEDB")
conMgr.ConnectionString = "Provider=SQLOLEDB.1;" & _
"Data Source=<servername>;Initial Catalog=AdventureWorks;" & _
"Integrated Security=SSPI;"
conMgr.Name = "SSIS Connection Manager for OLE DB"
conMgr.Description = "OLE DB connection to the AdventureWorks database."
' Create and configure an OLE DB source component.
Dim source As IDTSComponentMetaData100 = _
dataFlowTask.ComponentMetaDataCollection.New
source.ComponentClassID = "DTSAdapter.OleDbSource"
' Create the design-time instance of the source.
Dim srcDesignTime As CManagedComponentWrapper = source.Instantiate
' The ProvideComponentProperties method creates a default output.
srcDesignTime.ProvideComponentProperties()
' Assign the connection manager.
source.RuntimeConnectionCollection(0).ConnectionManager = _
DtsConvert.GetExtendedInterface(conMgr)
' Set the custom properties of the source.
srcDesignTime.SetComponentProperty("AccessMode", 2)
srcDesignTime.SetComponentProperty("SqlCommand", _
"Select * from Production.Product")
' Connect to the data source,
' and then update the metadata for the source.
srcDesignTime.AcquireConnections(Nothing)
srcDesignTime.ReinitializeMetaData()
srcDesignTime.ReleaseConnections()
' Create and configure an OLE DB destination.
Dim destination As IDTSComponentMetaData100 = _
dataFlowTask.ComponentMetaDataCollection.New
destination.ComponentClassID = "DTSAdapter.OleDbDestination"
' Create the design-time instance of the destination.
Dim destDesignTime As CManagedComponentWrapper = destination.Instantiate
' The ProvideComponentProperties method creates a default input.
destDesignTime.ProvideComponentProperties()
' Create the path from source to destination.
Dim path As IDTSPath100 = dataFlowTask.PathCollection.New
path.AttachPathAndPropagateNotifications(source.OutputCollection(0), _
destination.InputCollection(0))
' Get the destination's default input and virtual input.
Dim input As IDTSInput100 = destination.InputCollection(0)
Dim vInput As IDTSVirtualInput100 = input.GetVirtualInput
' Iterate through the virtual input column collection.
For Each vColumn As IDTSVirtualInputColumn100 In vInput.VirtualInputColumnCollection
' Call the SetUsageType method of the destination
' to add each available virtual input column as an input column.
destDesignTime.SetUsageType(input.ID, vInput, vColumn.LineageID, DTSUsageType.UT_READONLY)
Next
' Verify that the columns have been added to the input.
For Each inputColumn As IDTSInputColumn100 In destination.InputCollection(0).InputColumnCollection
Console.WriteLine(inputColumn.Name)
Next
Console.Read()
' Add other components to the data flow and connect them.
End Sub
End Module
|