데이터 흐름 구성 요소에 대한 사용자 인터페이스 개발

적용 대상: 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  

참고 항목

사용자 지정 데이터 흐름 구성 요소 만들기