Compartir a través de


Desarrollar una interfaz de usuario para un componente de flujo de datos

Los desarrolladores de componentes pueden proporcionar una interfaz de usuario personalizada para un componente, que se muestre en SQL Server Data Tools (SSDT) cuando se edite el componente. La implementación de una interfaz de usuario personalizada proporciona notificaciones cuando el componente se agrega o se elimina en una tarea de flujo de datos, así como cuando se solicita ayuda para el componente.

Aunque no proporcione una interfaz de usuario personalizada para su componente, los usuarios podrán configurar el componente y sus propiedades personalizadas mediante el editor avanzado. Para asegurarse de que el editor avanzado permita a los usuarios editar los valores de las propiedades personalizadas de forma adecuada, use las propiedades TypeConverter y UITypeEditor de IDTSCustomProperty100 cuando proceda. Para obtener más información, vea "Crear propiedades personalizadas" en Métodos en tiempo de diseño de un componente de flujo de datos.

Establecer la propiedad UITypeName

Para proporcionar una interfaz de usuario personalizada, el desarrollador debe establecer la propiedad UITypeName de DtsPipelineComponentAttribute en el nombre de una clase que implemente la interfaz IDtsComponentUI. Cuando el componente establece esta propiedad, SQL Server Integration Services carga y llama a la interfaz de usuario personalizada mientras el componente se edita en el Diseñador SSIS.

La propiedad UITypeName es una cadena delimitada por comas que identifica el nombre completo del tipo. En la lista siguiente se muestran en orden los elementos que identifican el tipo:

  • Nombre de tipo

  • Nombre del ensamblado

  • Versión del archivo

  • Referencia cultural

  • Token de clave pública

En el ejemplo de código siguiente se muestra una clase que deriva de la clase base PipelineComponent y especifica la propiedad 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

Implementar la interfaz IDtsComponentUI

La interfaz IDtsComponentUI contiene métodos a los que llama el Diseñador SSIS cuando se agrega, elimina o edita un componente. Los desarrolladores de componentes pueden proporcionar código en su implementación de estos métodos para interactuar con los usuarios del componente.

Normalmente, esta clase se implementa en un ensamblado independiente del propio componente. Aunque no se requiere el uso de un ensamblado independiente, esto permite al desarrollador generar e implementar el componente y la interfaz de usuario de forma independiente entre sí y mantiene una superficie binaria reducida del componente.

La implementación de una interfaz de usuario personalizada proporciona al desarrollador de componentes un mayor control sobre el componente al editarlo en el Diseñador SSIS. Por ejemplo, un componente puede agregar código al método New (al que se llama cuando un componente se agrega inicialmente a una tarea de flujo de datos) y mostrar un asistente que guía al usuario a lo largo del proceso de configuración inicial del componente.

Después de haber creado una clase que implementa la interfaz IDtsComponentUI, debe agregar código para responder a la interacción del usuario con el componente. El método Initialize proporciona la interfaz IDTSComponentMetaData100 del componente y se llama a este método antes que a los métodos New y Edit. Esta referencia debería almacenarse en una variable miembro privada y usarse para modificar los metadatos del componente posteriormente.

Modificar un componente y conservar los cambios

La interfaz IDTSComponentMetaData100 se proporciona como parámetro para el método Initialize. Esta referencia debería almacenarse en caché en una variable miembro mediante el código de interfaz de usuario y usarse después para modificar el componente como respuesta a la interacción del usuario con la interfaz de usuario.

Aunque puede modificar directamente el componente a través de la interfaz IDTSComponentMetaData100, es mejor crear una instancia de CManagedComponentWrapper mediante el método Instantiate. Al editar el componente directamente con la interfaz, se omiten las medidas de seguridad de validación del componente. La ventaja de usar la instancia en tiempo de diseño del componente mediante CManagedComponentWrapper es que se asegura de que el componente tenga control sobre los cambios realizados en él.

El valor devuelto por el método Edit determina si se conservan o se descartan los cambios realizados en un componente. Cuando este método devuelve false, se descartan todos los cambios; si devuelve true, se conservan los cambios realizados en el componente y el paquete se marca con la indicación de que debe guardarse.

Usar los servicios del Diseñador SSIS

El parámetro IServiceProvider del método Initialize proporciona acceso a los siguientes servicios del Diseñador SSIS:

Servicio

Descripción

IDtsClipboardService

Se usa para determinar si el componente se generó como parte de una operación de copiar y pegar o de cortar y pegar.

IDtsConnectionService

Se usa para obtener acceso a las conexiones existentes o crear nuevas conexiones en el paquete.

IErrorCollectionService

Se usa para capturar eventos de los componentes de flujo de datos cuando es necesario capturar todos los errores y advertencias generados por el componente en lugar de recibir solamente el último error o advertencia.

IDtsVariableService

Se usa para obtener acceso a las variables existentes o para crear nuevas variables en el paquete.

IDtsPipelineEnvironmentService

Lo usan los componentes de flujo de datos para obtener acceso a la tarea Flujo de datos primaria y a otros componentes del flujo de datos. Esta característica podría usarse para desarrollar un componente como el Asistente para dimensiones de variación lenta, que crea y conecta componentes de flujo de datos adicionales según sea necesario.

Estos servicios proporcionan a los desarrolladores de componentes la capacidad de crear objetos en el paquete donde se carga el componente y de obtener acceso a ellos.

Ejemplo

En el ejemplo de código siguiente se muestra la integración de una clase de interfaz de usuario personalizada que implementa la interfaz IDtsComponentUI y un formulario Windows Forms que actúa como editor de un componente.

Clase de interfaz de usuario personalizada

El código siguiente muestra la clase que implementa la interfaz IDtsComponentUI. El método Edit crea el editor de componentes y, a continuación, muestra el formulario. El valor devuelto por el formulario determina si se conservan los cambios realizados en el componente.

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

El código siguiente muestra la implementación del formulario Windows Forms que se muestra durante la llamada al 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
Icono de Integration Services (pequeño) Manténgase al día con Integration Services

Para obtener las descargas, artículos, ejemplos y vídeos más recientes de Microsoft, así como soluciones seleccionadas de la comunidad, visite la página de Integration Services en MSDN:


Para recibir notificaciones automáticas de estas actualizaciones, suscríbase a las fuentes RSS disponibles en la página.

Vea también

Conceptos

Crear un componente de flujo de datos personalizado