データ フロー コンポーネント用ユーザー インターフェイスの開発
適用対象: SQL Server Azure Data Factory の SSIS 統合ランタイム
コンポーネント開発者は、コンポーネント用のカスタム ユーザー インターフェイスを作成し、コンポーネントを編集するときに SQL Server Data Tools (SSDT) に表示させることができます。 カスタム ユーザー インターフェイスを実装すると、データ フロー タスクでコンポーネントが追加または削除されたとき、またはコンポーネントに関するヘルプが要求されたときに通知されます。
コンポーネント用のカスタム ユーザー インターフェイスを提供しない場合でも、ユーザーは、詳細エディターを使用することで、コンポーネントおよびそのカスタム プロパティを構成することができます。 詳細エディターでユーザーがカスタム プロパティ値を適切に変更できるようにするには、必要に応じて、TypeConverter の UITypeEditor および IDTSCustomProperty100 プロパティを使用します。 詳細については、「データ フロー コンポーネントのデザイン時のメソッド」の「カスタム プロパティの作成」を参照してください。
UITypeName プロパティの設定
カスタム ユーザー インターフェイスを提供するには、UITypeName の DtsPipelineComponentAttribute プロパティに、IDtsComponentUI インターフェイスを実装したクラスの名前を登録する必要があります。 このプロパティがコンポーネントによって設定されると、SQL Server Integration Services の SSIS デザイナーでコンポーネントを編集する際に、カスタム ユーザー インターフェイスが読み込まれ、必要な処理が呼び出されます。
UITypeName プロパティは、型の完全修飾名を示すコンマ区切り形式の文字列です。 次の一覧は、型を識別する要素を順に示したものです。
型名
[アセンブリ名]
ファイル バージョン
カルチャ
パブリック キー トークン
次のコード サンプルは、PipelineComponent 基本クラスから派生し、UITypeName プロパティを指定するクラスを示します。
[DtsPipelineComponent(
DisplayName="SampleComponent",
UITypeName="MyNamespace.MyComponentUIClassName,MyAssemblyName,Version=1.0.0.0,Culture=neutral,PublicKeyToken=abcd...",
ComponentType = ComponentType.Transform)]
public class SampleComponent : PipelineComponent
{
//TODO: Implement the component here.
}
<DtsPipelineComponent(DisplayName="SampleComponent", _
UITypeName="MyNamespace.MyComponentUIClassName,MyAssemblyName,Version=1.0.0.0,Culture=neutral,PublicKeyToken=abcd...", ComponentType=ComponentType.Transform)> _
Public Class SampleComponent
Inherits PipelineComponent
End Class
IDtsComponentUI インターフェイスの実装
IDtsComponentUI インターフェイスには、コンポーネントが追加、削除、および編集されたときに SSIS デザイナーが呼び出すメソッドがあります。 コンポーネント開発者は、これらのメソッドを実装する際にコードを記述することにより、ユーザーがコンポーネントを対話的に操作できるようにできます。
このクラスは通常、コンポーネント自体とは別個のアセンブリに実装します。 別個のアセンブリの使用は必須ではありませんが、これを使用することで、開発者はコンポーネントとユーザー インターフェイスを相互に独立に作成および配置することができ、コンポーネントのバイナリの占有領域を少なく抑えることができます。
カスタム ユーザー インターフェイスを実装すると、SSIS デザイナーでコンポーネントを編集する場合に比べ、コンポーネントの制御に関して開発者の意図をより反映することができます。 たとえば New メソッドにコードを追加し、データ フロー タスクに最初にコンポーネントが追加されたときにこのコードを呼び出して、コンポーネントの初期設定の手順を示すウィザードを表示することができます。
IDtsComponentUI インターフェイスを実装するクラスを作成した後、ユーザーがコンポーネントに対して操作を行ったときに応答するコードを追加する必要があります。 Initialize メソッドは、コンポーネントの IDTSComponentMetaData100 インターフェイスを提供するもので、New メソッドや Edit メソッドの実行前に呼び出されます。 この参照は、プライベート メンバー変数に保存しておき、後でコンポーネントのメタデータを修正する際に使用します。
コンポーネントの修正と変更の保存
IDTSComponentMetaData100 インターフェイスは、パラメーターとして Initialize メソッドに渡されます。 この参照は、ユーザー インターフェイスを実装するコードによってメンバー変数にキャッシュされ、このユーザー インターフェイスに対するユーザー操作に応じてコンポーネントを修正するために使用されます。
IDTSComponentMetaData100 インターフェイスを介してコンポーネントを直接修正することも可能ですが、CManagedComponentWrapper メソッドを使用して、Instantiate のインスタンスを作成することをお勧めします。 インターフェイスを使用してコンポーネントを直接編集すると、コンポーネントの検証処理が省略されるためです。 CManagedComponentWrapper を介してコンポーネントのデザイン時インスタンスを使用する利点は、コンポーネントに加えられた変更が確実にコンポーネント側で制御されるという点です。
Edit メソッドの戻り値は、コンポーネントに加えられた変更が保存されたか、破棄されたかを示します。 このメソッドによって false が返される場合、変更はすべて破棄されます。true の場合、コンポーネントに対する変更が保存され、パッケージを保存する必要があることを示すマークが付けられます。
SSIS デザイナーのサービスの使用
Initialize メソッドの IServiceProvider パラメーターにより、SSIS デザイナーの、次のサービスにアクセスすることができます。
サービス | 説明 |
---|---|
IDtsClipboardService | コンポーネントがコピー/貼り付け、または切り取り/貼り付け操作の一部として生成されたかどうかを判別するために使用します。 |
IDtsConnectionService | パッケージ内の既存の接続へのアクセス、または新しい接続の作成に使用します。 |
IErrorCollectionService | 最後に発生したエラーまたは警告だけを受け取るのではなく、コンポーネントで生成されたすべてのエラーおよび警告をキャプチャする必要がある場合に、データ フロー コンポーネントからのイベントをキャプチャするために使用します。 |
IDtsVariableService | パッケージ内の既存の変数へのアクセス、または新しい変数の作成に使用します。 |
IDtsPipelineEnvironmentService | データ フロー コンポーネントで親データ フロー タスクおよびデータ フロー内の他のコンポーネントにアクセスするために使用します。 この機能は、必要に応じて追加のデータ フロー コンポーネントを作成して接続するための、緩やかに変化するディメンション ウィザードなどのコンポーネントを開発する際に使用できます。 |
コンポーネント開発者は、これらのサービスを利用することにより、コンポーネントを読み込むパッケージ内のオブジェクトへのアクセスやオブジェクトの作成を行えます。
サンプル
次のコード例では、IDtsComponentUI インターフェイスを実装したカスタム ユーザー インターフェイス クラスと、コンポーネントのエディターとして使用できる Windows フォームの統合を示します。
カスタム ユーザー インターフェイス クラス
次のコードは、IDtsComponentUI インターフェイスを実装するクラスを示します。 Edit メソッドは、コンポーネント エディターを作成し、そのフォームを表示します。 フォームの戻り値により、コンポーネントに対する変更が保持されるかどうかが決定されます。
using System;
using System.Windows.Forms;
using Microsoft.SqlServer.Dts.Runtime;
using Microsoft.SqlServer.Dts.Pipeline.Design;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
namespace Microsoft.Samples.SqlServer.Dts
{
public class SampleComponentUI : IDtsComponentUI
{
IDTSComponentMetaData100 md;
IServiceProvider sp;
public void Help(System.Windows.Forms.IWin32Window parentWindow)
{
}
public void New(System.Windows.Forms.IWin32Window parentWindow)
{
}
public void Delete(System.Windows.Forms.IWin32Window parentWindow)
{
}
public bool Edit(System.Windows.Forms.IWin32Window parentWindow, Variables vars, Connections cons)
{
// Create and display the form for the user interface.
SampleComponentUIForm componentEditor = new SampleComponentUIForm(cons, vars, md);
DialogResult result = componentEditor.ShowDialog(parentWindow);
if (result == DialogResult.OK)
return true;
return false;
}
public void Initialize(IDTSComponentMetaData100 dtsComponentMetadata, IServiceProvider serviceProvider)
{
// Store the component metadata.
this.md = dtsComponentMetadata;
}
}
}
Imports System
Imports System.Windows.Forms
Imports Microsoft.SqlServer.Dts.Runtime
Imports Microsoft.SqlServer.Dts.Pipeline.Design
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
Namespace Microsoft.Samples.SqlServer.Dts
Public Class SampleComponentUI
Implements IDtsComponentUI
Private md As IDTSComponentMetaData100
Private sp As IServiceProvider
Public Sub Help(ByVal parentWindow As System.Windows.Forms.IWin32Window)
End Sub
Public Sub New(ByVal parentWindow As System.Windows.Forms.IWin32Window)
End Sub
Public Sub Delete(ByVal parentWindow As System.Windows.Forms.IWin32Window)
End Sub
Public Function Edit(ByVal parentWindow As System.Windows.Forms.IWin32Window, ByVal vars As Variables, ByVal cons As Connections) As Boolean
' Create and display the form for the user interface.
Dim componentEditor As SampleComponentUIForm = New SampleComponentUIForm(cons, vars, md)
Dim result As DialogResult = componentEditor.ShowDialog(parentWindow)
If result = DialogResult.OK Then
Return True
End If
Return False
End Function
Public Sub Initialize(ByVal dtsComponentMetadata As IDTSComponentMetaData100, ByVal serviceProvider As IServiceProvider)
Me.md = dtsComponentMetadata
End Sub
End Class
End Namespace
カスタム エディター
次のコードは、Edit メソッドを呼び出すと表示される Windows フォームの実装を示しています。
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime;
namespace Microsoft.Samples.SqlServer.Dts
{
public partial class SampleComponentUIForm : System.Windows.Forms.Form
{
private Connections connections;
private Variables variables;
private IDTSComponentMetaData100 metaData;
private CManagedComponentWrapper designTimeInstance;
private System.ComponentModel.IContainer components = null;
public SampleComponentUIForm( Connections cons, Variables vars, IDTSComponentMetaData100 md)
{
variables = vars;
connections = cons;
metaData = md;
}
private void btnOk_Click(object sender, System.EventArgs e)
{
if (designTimeInstance == null)
designTimeInstance = metaData.Instantiate();
designTimeInstance.SetComponentProperty( "CustomProperty", txtCustomPropertyValue.Text);
this.Close();
}
private void btnCancel_Click(object sender, System.EventArgs e)
{
this.Close();
}
}
}
Imports System
Imports System.Drawing
Imports System.Collections
Imports System.ComponentModel
Imports System.Windows.Forms
Imports System.Data
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
Imports Microsoft.SqlServer.Dts.Runtime
Namespace Microsoft.Samples.SqlServer.Dts
Public Partial Class SampleComponentUIForm
Inherits System.Windows.Forms.Form
Private connections As Connections
Private variables As Variables
Private metaData As IDTSComponentMetaData100
Private designTimeInstance As CManagedComponentWrapper
Private components As System.ComponentModel.IContainer = Nothing
Public Sub New(ByVal cons As Connections, ByVal vars As Variables, ByVal md As IDTSComponentMetaData100)
variables = vars
connections = cons
metaData = md
End Sub
Private Sub btnOk_Click(ByVal sender As Object, ByVal e As System.EventArgs)
If designTimeInstance Is Nothing Then
designTimeInstance = metaData.Instantiate
End If
designTimeInstance.SetComponentProperty("CustomProperty", txtCustomPropertyValue.Text)
Me.Close
End Sub
Private Sub btnCancel_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Me.Close
End Sub
End Class
End Namespace