Sviluppo di un'interfaccia utente per un componente del flusso di dati

Gli sviluppatori di componenti possono fornire un'interfaccia utente personalizzata per un componente, che viene visualizzata in SQL Server Data Tools (SSDT) quando il componente viene modificato. L'implementazione di un'interfaccia utente personalizzata fornisce notifiche quando il componente viene aggiunto o eliminato da un'attività Flusso di dati e quando per il componente è richiesta la Guida.

Se non si fornisce un'interfaccia utente personalizzata per il componente, gli utenti possono comunque configurare il componente e le relative proprietà personalizzate utilizzando l'editor avanzato. È possibile assicurarsi che l'editor avanzato consenta agli utenti di modificare in modo appropriato i valori delle proprietà personalizzate tramite le proprietà TypeConverter e UITypeEditor di IDTSCustomProperty100, a seconda dei casi. Per ulteriori informazioni, vedere la sezione relativa alla creazione di proprietà personalizzate in Metodi della fase di progettazione di un componente del flusso di dati.

Impostazione della proprietà UITypeName

Per fornire un'interfaccia utente personalizzata, lo sviluppatore deve impostare la proprietà UITypeName di DtsPipelineComponentAttribute sul nome di una classe che implementa l'interfaccia IDtsComponentUI. Quando questa proprietà viene impostata dal componente, SQL Server Integration Services carica e chiama l'interfaccia utente personalizzata quando il componente viene modificato in Progettazione SSIS.

La proprietà UITypeName è una stringa delimitata da virgole che identifica il nome completo del tipo. Nell'elenco seguente sono illustrati, nell'ordine, gli elementi che identificano il tipo:

  • Nome tipo

  • Nome assembly

  • Versione file

  • Lingua

  • Token di chiave pubblica

Nell'esempio di codice seguente è illustrata una classe che deriva dalla classe di base PipelineComponent e specifica la proprietà 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

Implementazione dell'interfaccia IDtsComponentUI

L'interfaccia IDtsComponentUI contiene i metodi chiamati da Progettazione SSIS quando un componente viene aggiunto, eliminato e modificato. Gli sviluppatori di componenti possono fornire codice nella loro implementazione di questi metodi per interagire con gli utenti del componente.

Questa classe viene in genere implementata in un assembly distinto dal componente stesso. Anche se non è obbligatorio utilizzare un assembly distinto, in questo modo lo sviluppatore può compilare e distribuire il componente e l'interfaccia utente indipendentemente l'uno dall'altra e mantenere piccola l'impronta binaria del componente.

L'implementazione di un'interfaccia utente personalizzata fornisce allo sviluppatore di componenti un maggior controllo sul componente quando viene modificato in Progettazione SSIS. Ad esempio, un componente può aggiungere codice al metodo New, che viene chiamato quando il componente viene inizialmente aggiunto a un'attività Flusso di dati, e visualizzare una procedura guidata che consente all'utente di completare la configurazione iniziale del componente.

Dopo aver creato una classe che implementa l'interfaccia IDtsComponentUI, è necessario aggiungere codice per rispondere all'interazione dell'utente con il componente. Il metodo Initialize fornisce l'interfaccia IDTSComponentMetaData100 del componente e viene chiamato prima dei metodi New e Edit. Questo riferimento deve essere archiviato in una variabile membro privata e utilizzato in seguito per modificare i metadati del componente.

Come effettuare modifiche in un componente e renderle persistenti

L'interfaccia IDTSComponentMetaData100 viene fornita come parametro al metodo Initialize. Questo riferimento deve essere memorizzato nella cache in una variabile membro dal codice dell'interfaccia utente e quindi utilizzato per modificare il componente in risposta all'interazione dell'utente con l'interfaccia utente.

Anche se è possibile modificare direttamente il componente tramite l'interfaccia IDTSComponentMetaData100, è preferibile creare un'istanza di CManagedComponentWrapper tramite il metodo Instantiate. Quando si modifica direttamente il componente tramite l'interfaccia, le misure di sicurezza di convalida del componente vengono ignorate. Il vantaggio dell'utilizzo dell'istanza della fase di progettazione del componente tramite CManagedComponentWrapper è che ci si assicura che il componente controlli le modifiche apportate.

Il valore restituito del metodo Edit determina se le modifiche apportate a un componente vengono rese persistenti o annullate. Quando questo metodo restituisce false, tutte le modifiche vengono annullate; se restituisce true, le modifiche al componente vengono rese persistenti e il pacchetto viene contrassegnato in modo da richiederne il salvataggio.

Utilizzo dei servizi di Progettazione SSIS

Il parametro IServiceProvider del metodo Initialize fornisce l'accesso ai servizi seguenti di Progettazione SSIS:

Servizio

Descrizione

IDtsClipboardService

Viene utilizzato per determinare se il componente è stato generato come parte di un'operazione Copia/Incolla o Taglia/Incolla.

IDtsConnectionService

Viene utilizzato per accedere alle connessioni esistenti o per creare nuove connessioni nel pacchetto.

IErrorCollectionService

Viene utilizzato per acquisire eventi dai componenti del flusso di dati quando è necessario acquisire tutti gli errori e gli avvisi generati dal componente anziché ricevere solo quelli più recenti.

IDtsVariableService

Viene utilizzato per accedere alle variabili esistenti o per creare nuove variabili nel pacchetto.

IDtsPipelineEnvironmentService

Viene utilizzato dai componenti del flusso di dati per accedere all'attività Flusso di dati padre e ad altri componenti del flusso di dati. Questa caratteristica può essere utilizzata per sviluppare un componente come la Creazione guidata dimensioni a modifica lenta, che crea e connette componenti del flusso di dati aggiuntivi se necessario.

Questi servizi offrono agli sviluppatori di componenti la possibilità di accedere e creare oggetti nel pacchetto in cui viene caricato il componente.

Esempio

Nell'esempio di codice seguente è illustrata l'integrazione di una classe di interfaccia utente personalizzata che implementa l'interfaccia IDtsComponentUI e un Windows Form che funge da editor per un componente.

Classe dell'interfaccia utente personalizzata

Nell'esempio di codice seguente è illustrata la classe che implementa l'interfaccia IDtsComponentUI. Il metodo Edit crea l'editor del componente, quindi visualizza il form. Il valore restituito del form determina se le modifiche apportate al componente sono persistenti.

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 personalizzato

Nel codice seguente è illustrata l'implementazione del Windows Form visualizzato durante la chiamata al metodo 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
Icona di Integration Services (piccola) Rimanere aggiornati con Integration Services

Per i download, gli articoli, gli esempi e i video Microsoft più recenti, oltre alle soluzioni selezionate dalla community, visitare la pagina Integration Services sul sito MSDN:


Per ricevere notifica automatica su questi aggiornamenti, sottoscrivere i feed RSS disponibili nella pagina.

Vedere anche

Concetti

Creazione di un componente flusso di dati personalizzato