Desenvolvendo uma interface de usuário para um componente de fluxo de dados

Aplica-se a: SQL Server SSIS Integration Runtime em Azure Data Factory

Os programadores de componentes podem fornecer uma interface de utilizador personalizada para um componente, que é exibida no SQL Server Data Tools (SSDT) quando o componente é editado. Implementar uma interface de utilizador personalizada fornece-lhe notificações quando o componente é adicionado ou eliminado de uma tarefa de fluxo de dados, e quando é solicitada ajuda para o componente.

Se não fornecer uma interface de utilizador personalizada para o seu componente, os utilizadores ainda podem configurar o componente e as suas propriedades personalizadas usando o Editor Avançado. Pode garantir que o Editor Avançado permite aos utilizadores editar valores de propriedades personalizados de forma apropriada, usando as TypeConverter propriedades e UITypeEditor dos IDTSCustomProperty100 quando apropriado. Para mais informações, consulte "Criar Propriedades Personalizadas" em Design-time Methods of a Fluxo de Dados Component.

Definir a propriedade UITypeName

Para fornecer uma interface personalizada, o programador deve definir a UITypeName propriedade de o DtsPipelineComponentAttribute como nome de uma classe que implementa a IDtsComponentUI interface. Quando esta propriedade é definida pelo componente, o SQL Server Integration Services carrega e chama a interface de utilizador personalizada quando o componente é editado no SSIS Designer.

A UITypeName propriedade é uma cadeia delimitada por vírgulas que identifica o nome totalmente qualificado do tipo. A lista seguinte mostra, por ordem, os elementos que identificam o tipo:

  • Nome do tipo

  • Nome do Assembly

  • Versão do ficheiro

  • Cultura

  • Token de chave pública

O exemplo de código seguinte mostra uma classe que deriva da PipelineComponent classe base e especifica a UITypeName propriedade.

[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  

Implementação da Interface IDtsComponentUI

A IDtsComponentUI interface contém métodos que o SSIS Designer chama quando um componente é adicionado, eliminado e editado. Os programadores de componentes podem fornecer código na sua implementação destes métodos para interagir com os utilizadores do componente.

Esta classe é tipicamente implementada num assembly separado do próprio componente. Embora não seja necessário usar um conjunto separado, isto permite ao programador construir e implementar o componente e a interface de utilizador independentemente um do outro, mantendo a área binária do componente pequena.

Implementar uma interface de utilizador personalizada dá ao desenvolvedor do componente mais controlo sobre o componente à medida que este é editado no SSIS Designer. Por exemplo, um componente pode adicionar código ao New método, que é chamado quando um componente é inicialmente adicionado a uma tarefa de fluxo de dados, e exibir um assistente que orienta o utilizador na configuração inicial do componente.

Depois de criar uma classe que implementa a IDtsComponentUI interface, deve adicionar código para responder à interação do utilizador com o componente. O Initialize método fornece a IDTSComponentMetaData100 interface do componente, e é chamado antes dos New métodos e Edit . Esta referência deve ser armazenada numa variável membro privada e usada para modificar os metadados do componente posteriormente.

Modificação de um componente e persistência de alterações

A IDTSComponentMetaData100 interface é fornecida como um parâmetro ao Initialize método. Esta referência deve ser armazenada em cache numa variável membro pelo código da interface do utilizador, e depois usada para modificar o componente em resposta à interação do utilizador com a interface.

Embora possa modificar o componente diretamente através da IDTSComponentMetaData100 interface, é melhor criar uma instância do CManagedComponentWrapper usando o Instantiate método. Quando editas o componente diretamente usando a interface, contornas as salvaguardas de validação do componente. A vantagem de usar a instância em tempo de design do componente é CManagedComponentWrapper garantir que o componente tem controlo sobre as alterações feitas nele.

O valor de retorno do Edit método determina se as alterações feitas a um componente são persistidas ou descartadas. Quando este método retorna falso, todas as alterações são descartadas; True mantém as alterações ao componente e marca o pacote como necessitando de ser guardado.

Utilização dos Serviços do Designer do SSIS

O parâmetro IServiceProvider do Initialize método fornece acesso aos seguintes serviços do SSIS Designer:

Service Description
IDtsClipboardService Usado para determinar se o componente foi gerado como parte de uma operação de copiar/colar ou cortar/colar.
IDtsConnectionService Usado para aceder a ligações existentes ou para criar novas ligações no pacote.
IErrorCollectionService Usado para capturar eventos dos componentes do fluxo de dados quando é necessário capturar todos os erros e avisos gerados pelo componente, em vez de receber apenas o último erro ou aviso.
IDtsVariableService Usado para aceder a variáveis existentes ou para criar novas variáveis no pacote.
IDtsPipelineEnvironmentService Utilizado pelos componentes do data flow para aceder à tarefa principal Fluxo de Dados e a outros componentes do data flow. Esta funcionalidade pode ser usada para desenvolver um componente como o Assistente de Dimensões Que Muda Lentamente, que cria e liga componentes adicionais de fluxo de dados conforme necessário.

Estes serviços oferecem aos programadores de componentes a capacidade de aceder e criar objetos no pacote onde o componente é carregado.

Exemplo

O exemplo de código seguinte mostra a integração de uma classe de interface personalizada que implementa a IDtsComponentUI interface e um formulário Windows que serve como editor para um componente.

Classe de Interface de Utilizador Personalizada

O código seguinte mostra a classe que implementa a IDtsComponentUI interface. O Edit método cria o editor de componentes e depois apresenta o formulário. O valor de retorno do formulário determina se as alterações ao componente são persistentes.

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  

Editor Personalizado

O código seguinte mostra a implementação do formulário Windows que é mostrada durante a chamada ao Edit método.

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