데이터 흐름 구성 요소에 대한 사용자 인터페이스 개발
적용 대상: Azure Data Factory의 SQL Server SSIS Integration Runtime
구성 요소 개발자는 구성 요소를 편집할 때 SSDT(SQL Server Data Tools)에 표시되는 구성 요소에 대한 사용자 지정 사용자 인터페이스를 제공할 수 있습니다. 사용자 지정 사용자 인터페이스를 구현하면 구성 요소가 데이터 흐름 태스크에 추가되거나 삭제될 때와 구성 요소에 대한 도움말이 요청될 때 알림을 제공합니다.
구성 요소에 대한 사용자 지정 사용자 인터페이스를 제공하지 않는 경우에도 사용자는 고급 편집기 사용하여 구성 요소 및 해당 사용자 지정 속성을 구성할 수 있습니다. 고급 편집기 사용자가 적절한 경우의 속성 및 UITypeEditor 속성을 사용하여 TypeConverter 사용자 지정 속성 IDTSCustomProperty100 값을 적절하게 편집할 수 있도록 할 수 있습니다. 자세한 내용은 데이터 흐름 구성 요소의 디자인 타임 메서드에서 "사용자 지정 속성 만들기"를 참조하세요.
UITypeName 속성 설정
사용자 지정 사용자 인터페이스를 제공하려면 개발자가 인터페이스를 구현 IDtsComponentUI 하는 클래스의 이름으로 속성을 DtsPipelineComponentAttribute 설정 UITypeName 해야 합니다. 구성 요소에서 이 속성을 설정하면 SSIS 디자이너에서 구성 요소를 편집할 때 SQL Server Integration Services가 사용자 지정 사용자 인터페이스를 로드하고 호출합니다.
이 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 Designer에서 호출하는 메서드가 포함되어 있습니다. 구성 요소 개발자는 이러한 메서드의 구현에서 구성 요소 사용자와 상호 작용하기 위한 코드를 제공할 수 있습니다.
이 클래스는 일반적으로 구성 요소 자체와 분리된 어셈블리에서 구현됩니다. 별도의 어셈블리를 사용할 필요는 없지만 개발자는 구성 요소와 사용자 인터페이스를 서로 독립적으로 빌드 및 배포하고 구성 요소의 이진 공간을 작게 유지할 수 있습니다.
사용자 지정 사용자 인터페이스를 구현하면 구성 요소 개발자가 SSIS 디자이너에서 편집할 때 구성 요소를 보다 쉽게 제어할 수 있습니다. 예를 들어 구성 요소가 데이터 흐름 태스크에 New 처음 추가되면 호출되는 메서드에 코드를 추가하고 구성 요소의 초기 구성을 통해 사용자를 안내하는 마법사를 표시할 수 있습니다.
IDtsComponentUI 인터페이스를 구현하는 클래스를 만든 후에는 사용자와 구성 요소의 상호 작용에 응답하기 위한 코드를 추가해야 합니다. 메서드는 Initialize 구성 요소의 인터페이스를 제공 IDTSComponentMetaData100 하며 메서드와 메서드 앞에 New Edit 호출됩니다. 이 참조는 프라이빗 멤버 변수에 저장되고 그 후에 구성 요소의 메타데이터를 수정하는 데 사용해야 합니다.
구성 요소 수정 및 변경 내용 지속
인터페이스는 IDTSComponentMetaData100 메서드에 대한 매개 변수 Initialize 로 제공됩니다. 이 참조는 사용자 인터페이스 코드에 의해 멤버 변수에 캐시된 다음 사용자 인터페이스와의 사용자 상호 작용에 대한 응답으로 구성 요소를 수정하는 데 사용되어야 합니다.
인터페이스를 통해 IDTSComponentMetaData100 구성 요소를 직접 수정할 수 있지만 메서드를 사용하여 Instantiate 인스턴스를 CManagedComponentWrapper 만드는 것이 좋습니다. 이 인터페이스를 사용하여 직접 구성 요소를 편집하면 구성 요소 보호를 위한 유효성 검사가 무시됩니다. 구성 요소를 통해 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
사용자 지정 편집기
다음 코드는 메서드를 호출하는 동안 표시되는 Windows 양식의 구현을 보여 줍니다 Edit .
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