Compartilhar via


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

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

Os desenvolvedores de componentes podem fornecer uma interface de usuário personalizada para um componente, que é exibida no SQL Server Data Tools (SSDT) quando o componente é editado. A implementação de uma interface de usuário personalizada fornece a você uma notificação quando o componente é adicionado a ou excluído de uma tarefa de fluxo de dados, e quando é solicitada ajuda para o componente.

Se você não fornecer uma interface de usuário personalizada para seu componente, os usuários ainda poderão configurar o componente e suas propriedades personalizadas utilizando o Editor Avançado. Para certificar-se de que o Editor Avançado permita aos usuários editar valores de propriedade personalizados adequadamente, utilize as propriedades TypeConverter e UITypeEditor do IDTSCustomProperty100 quando apropriado. Para obter mais informações, consulte "Criando propriedades personalizadas" em Métodos de tempo de design de um componente de fluxo de dados.

Definindo a propriedade UITypeName

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

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

  • Nome do tipo

  • Nome do assembly

  • Versão do arquivo

  • Cultura

  • Token de chave pública

O exemplo de código a seguir mostra uma classe que deriva da classe base PipelineComponent e especifica a propriedade 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  

Implementando a interface IDtsComponentUI

A interface IDtsComponentUI contém métodos que o Designer SSIS chama quando um componente é adicionado, excluído e editado. Desenvolvedores de componente podem fornecer código na sua implementação desses métodos para interagir com usuários do componente.

Essa classe costuma ser implementada em um assembly separado do próprio componente. Embora o uso de um assembly separado não seja exigido, isso permite ao desenvolvedor criar e empregar o componente e a interface de usuário separadamente, e mantém a superfície binária do componente pequena.

A implementação de uma interface de usuário personalizada dá ao desenvolvedor de componente mais controle sobre o componente pois ele é editado no Designer SSIS. Por exemplo, um componente pode adicionar código ao método New, que é chamado quando um componente é inicialmente adicionado a uma tarefa de fluxo de dados, e exibir um assistente que orienta o usuário na configuração inicial do componente.

Após criar uma classe que implementa a interface IDtsComponentUI, adicione código para responder à interação do usuário com o componente. O método Initialize fornece a interface IDTSComponentMetaData100 do componente e é chamado antes dos métodos New e Edit. Essa referência deve ser armazenada em uma variável de membro particular e usada para modificar metadados do componente depois disso.

Modificando um componente e mantendo alterações

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

Embora você possa modificar o componente diretamente através da interface IDTSComponentMetaData100, é melhor criar uma instância do CManagedComponentWrapper utilizando o método Instantiate. Quando você edita o componente diretamente através da interface, ignora as garantias de validação dele. A vantagem de utilizar a instância de tempo de design do componente através do CManagedComponentWrapper é que você garante o controle pelo componente das alterações feitas nele.

O valor de retorno do método Edit determina se alterações feitas em um componente são mantidas ou descartadas. Quando esse método retorna false, todas as alterações são descartadas; true mantém as alterações no componente e marca o pacote que deve ser salvo.

Usando os serviços do Designer SSIS

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

Serviço Descrição
IDtsClipboardService Usado para determinar se o componente foi gerado como parte de uma operação copiar/colar ou recortar/colar.
IDtsConnectionService Usado acessar conexões existentes ou criar novas conexões no pacote.
IErrorCollectionService Usado para capturar eventos de componentes de fluxo de dados quando você precisa capturar todos os erros e avisos levantados pelo componente, em vez de receber apenas o último erro ou aviso.
IDtsVariableService Usado para acessar variáveis existentes ou criar novas variáveis no pacote.
IDtsPipelineEnvironmentService Usado por componentes de fluxo de dados para acessar a tarefa Fluxo de Dados pai e outros componentes no fluxo de dados. Esse recurso pode ser usado para desenvolver um componente como o Assistente para Dimensões de Alteração Lenta, que cria e conecta componentes de fluxo de dados adicionais, conforme necessário.

Esses serviços oferecem aos desenvolvedores de componente a capacidade de acessar e criar objetos no pacote no qual o componente é carregado.

Amostra

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

Classe de interface do usuário personalizada

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

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 a seguir mostra a implementação do formulário do Windows que é mostrado durante a chamada ao método 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  

Consulte Também

Criando um componente de fluxo de dados personalizado