データ フロー コンポーネント用ユーザー インターフェイスの開発
コンポーネント開発者は、コンポーネント用のカスタム ユーザー インターフェイスを作成し、コンポーネントを編集するときに Business Intelligence Development Studio に表示させることができます。カスタム ユーザー インターフェイスを実装すると、データ フロー タスクでコンポーネントが追加または削除されたとき、またはコンポーネントに関するヘルプが要求されたときに通知されます。
コンポーネント用のカスタム ユーザー インターフェイスを提供しない場合でも、ユーザーは、詳細エディタを使用することで、コンポーネントおよびそのカスタム プロパティを構成することができます。詳細エディタでユーザーがカスタム プロパティ値を適切に変更できるようにするには、必要に応じて、IDTSCustomProperty100 の TypeConverter および UITypeEditor プロパティを使用します。詳細については、「データ フロー コンポーネントのデザイン時のメソッド」の「カスタム プロパティの作成」を参照してください。
UITypeName プロパティの設定
カスタム ユーザー インターフェイスを提供するには、DtsPipelineComponentAttribute の UITypeName プロパティに、IDtsComponentUI インターフェイスを実装したクラスの名前を登録する必要があります。このプロパティがコンポーネントによって設定されると、SQL ServerIntegration 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 インターフェイスを介してコンポーネントを直接修正することも可能ですが、Instantiate メソッドを使用して、CManagedComponentWrapper のインスタンスを作成することをお勧めします。インターフェイスを使用してコンポーネントを直接編集すると、コンポーネントの検証処理が省略されるためです。CManagedComponentWrapper を介してコンポーネントのデザイン時インスタンスを使用する利点は、コンポーネントに加えられた変更が確実にコンポーネント側で制御されるという点です。
Edit メソッドの戻り値は、コンポーネントに加えられた変更が保存されたか、破棄されたかを示します。このメソッドによって false が返される場合、変更はすべて破棄されます。true の場合、コンポーネントに対する変更が保存され、パッケージを保存する必要があることを示すマークが付けられます。
SSIS デザイナのサービスの使用
Initialize メソッドの IServiceProvider パラメータにより、SSIS デザイナの、次のサービスにアクセスすることができます。
サービス |
説明 |
---|---|
コンポーネントがコピー/貼り付け、または切り取り/貼り付け操作の一部として生成されたかどうかを判別するために使用します。 |
|
パッケージ内の既存の接続へのアクセス、または新しい接続の作成に使用します。 |
|
最後に発生したエラーまたは警告だけを受け取るのではなく、コンポーネントで生成されたすべてのエラーおよび警告をキャプチャする必要がある場合に、データ フロー コンポーネントからのイベントをキャプチャするために使用します。 |
|
パッケージ内の既存の変数へのアクセス、または新しい変数の作成に使用します。 |
|
データ フロー コンポーネントで親データ フロー タスクおよびデータ フロー内の他のコンポーネントにアクセスするために使用します。この機能は、追加のデータ フロー コンポーネントを必要に応じて作成および接続する緩やかに変化するディメンション ウィザードのようなコンポーネントの開発に使用できます。 |
これらのサービスを使用すると、コンポーネント開発者は、コンポーネントの読み込み先パッケージ内にある既存のオブジェクトにアクセスしたり、オブジェクトを新しく作成できます。
サンプル
次のコード例では、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
|