Partager via


Développement d'une interface utilisateur pour un composant de flux de données

S’applique à : SQL Server SSIS Integration Runtime dans Azure Data Factory

Les développeurs de composants peuvent fournir une interface utilisateur personnalisée pour un composant. Cette interface s'affiche dans SQL Server Data Tools (SSDT) lors de la modification du composant. Grâce à l'implémentation d'une interface utilisateur personnalisée, vous êtes averti lorsque le composant est ajouté ou supprimé d'une tâche de flux de données, et lorsque de l'aide est demandée pour le composant.

Si vous ne fournissez pas d'interface utilisateur personnalisée pour votre composant, les utilisateurs peuvent encore configurer le composant et ses propriétés personnalisées à l'aide de l'éditeur avancé. Vous pouvez vous assurer que l'éditeur avancé permet aux utilisateurs de modifier convenablement des valeurs de propriété personnalisées à l'aide des propriétés TypeConverter et UITypeEditor de IDTSCustomProperty100 le cas échéant. Pour plus d’informations, consultez « Création de propriétés personnalisées » dans Méthodes de conception d’un composant de flux de données.

Définition de la propriété UITypeName

Pour fournir une interface utilisateur personnalisée, le développeur doit attribuer à la propriété UITypeName de DtsPipelineComponentAttribute le nom d'une classe qui implémente l'interface IDtsComponentUI. Lorsque cette propriété est définie par le composant, SQL Server Integration Services charge et appelle l’interface utilisateur personnalisée lorsque le composant est modifié dans le concepteur SSIS.

La propriété UITypeName est une chaîne délimitée par des virgules qui identifie le nom qualifié complet du type. La liste suivante affiche, dans l'ordre, les éléments qui identifient le type :

  • Nom de type

  • Nom de l'assembly

  • Version de fichier

  • Culture

  • Jeton de clé publique

L'exemple de code suivant montre une classe dérivée de la classe de base PipelineComponent et spécifie la propriété 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  

Implémentation de l'interface IDtsComponentUI

L'interface IDtsComponentUI contient des méthodes que le concepteur SSIS appelle lorsqu'un composant est ajouté, supprimé ou modifié. Les développeurs de composants peuvent fournir du code dans leur implémentation de ces méthodes pour interagir avec les utilisateurs des composants.

Cette classe est généralement implémentée dans un assembly distinct du composant lui-même. Bien qu'elle ne soit pas obligatoire, l'utilisation d'un assembly séparé permet au développeur de générer et déployer le composant et l'interface utilisateur indépendamment l'un de l'autre et de limiter l'encombrement binaire du composant.

L'implémentation d'une interface utilisateur personnalisée permet au développeur de composants de mieux contrôler le composant lorsqu'il est modifié dans le concepteur SSIS. Par exemple, un composant peut ajouter du code à la méthode New, appelée lorsqu'un composant est initialement ajouté à une tâche de flux de données, et afficher un Assistant qui guide l'utilisateur à travers la configuration initiale du composant.

Après avoir créé une classe qui implémente l'interface IDtsComponentUI, vous devez ajouter du code pour répondre à l'interaction de l'utilisateur avec le composant. La méthode Initialize fournit l'interface IDTSComponentMetaData100 du composant et est appelée avant les méthodes New et Edit. Cette référence doit être stockée dans une variable membre privée et utilisée ensuite pour modifier les métadonnées du composant.

Modification d'un composant et persistance des modifications

L'interface IDTSComponentMetaData100 est fournie en tant que paramètre à la méthode Initialize. Cette référence doit être mise en cache dans une variable membre par le code d'interface utilisateur, puis utilisée pour modifier le composant en réponse à l'interaction de l'utilisateur avec l'interface utilisateur.

Bien que vous puissiez modifier le composant directement à partir de l'interface IDTSComponentMetaData100, il est préférable de créer une instance de CManagedComponentWrapper à l'aide de la méthode Instantiate. Lorsque vous modifiez directement le composant à l'aide de l'interface, vous contournez les dispositifs de protection de la validation du composant. L'utilisation de l'instance du composant au moment de la conception par le biais de CManagedComponentWrapper présente l'avantage de garantir que le composant peut contrôler les modifications qui lui sont appliquées.

La valeur de retour de la méthode Edit détermine si les modifications apportées à un composant sont conservées ou supprimées. Lorsque cette méthode retourne false, toutes les modifications sont ignorées ; true conserve les modifications apportées au composant et marque le package comme devant être enregistré.

Utilisation des services du concepteur SSIS

Le paramètre IServiceProvider de la méthode Initialize fournit l’accès aux services suivants du concepteur SSIS :

Service Description
IDtsClipboardService Permet de déterminer si le composant a été généré dans le cadre d'une opération copier/coller ou couper/coller.
IDtsConnectionService Permet d'accéder aux connexions existantes ou de créer des connexions dans le package.
IErrorCollectionService Permet de capturer des événements à partir de composants de flux de données lorsque vous devez capturer l'ensemble des erreurs et avertissements déclenchés par le composant au lieu de ne recevoir que la dernière erreur ou le dernier avertissement.
IDtsVariableService Permet d'accéder aux variables existantes ou de créer des variables dans le package.
IDtsPipelineEnvironmentService Permet aux composants de flux de données d'accéder à la tâche de flux de données parente et aux autres composants dans le flux de données. Cette fonctionnalité pourrait être utilisée pour développer un composant semblable à l'Assistant Dimension à variation lente qui crée et connecte des composants de flux de données supplémentaires si nécessaire.

Ces services fournissent aux développeurs de composants la capacité d'accéder à des objets (ou d'en créer) dans le package dans lequel le composant est chargé.

Exemple

L'exemple de code suivant montre l'intégration d'une classe d'interface utilisateur personnalisée qui implémente l'interface IDtsComponentUI, et un Windows Form qui fait office d'éditeur pour un composant.

Classe d'interface utilisateur personnalisée

Le code suivant montre la classe qui implémente l'interface IDtsComponentUI. La méthode Edit crée l'éditeur de composant, puis affiche le formulaire. La valeur de retour du formulaire détermine si les modifications apportées au composant sont rendues persistantes.

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  

Éditeur personnalisé

Le code suivant montre l'implémentation du Windows Form affiché lors de l'appel à la méthode 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  

Voir aussi

Création d'un composant de flux de données personnalisé