Desarrollar una interfaz de usuario para un componente de flujo de datos
Se aplica a: SQL Server SSIS Integration Runtime en Azure Data Factory
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, consulte la sección "Creating Custom Properties (Crear propiedades personalizadas)" en Design-time Methods of a Data Flow Component (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 IServiceProvide 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.
Muestra
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