Entwickeln einer Benutzeroberfläche für eine Datenflusskomponente

Komponentenentwickler können für eine Komponente eine benutzerdefinierte Benutzeroberfläche bereitstellen, die in SQL Server-Datentools (SSDT) angezeigt wird, wenn die Komponente bearbeitet wird. Bei der Implementierung einer benutzerdefinierten Benutzeroberfläche werden Ihnen Benachrichtigungen bereitgestellt, wenn die Komponente zur Datenflusstask hinzugefügt oder aus diesem gelöscht wird und wenn für die Komponente Hilfe angefordert wird.

Wenn Sie keine individuelle Benutzeroberfläche für Ihre Komponente bereitstellen, können die Benutzer die Komponente und ihre benutzerdefinieren Eigenschaften auch mithilfe des erweiterten Editors konfigurieren. Sie können sicherstellen, dass der erweiterte Editor es Benutzern ermöglicht, mithilfe der TypeConverter- und UITypeEditor-Eigenschaften von IDTSCustomProperty100 benutzerdefinierte Eigenschaftswerte ggf. entsprechend zu bearbeiten. Weitere Informationen finden Sie unter "Erstellen von benutzerdefinierten Eigenschaften" unter Entwurfszeitmethoden einer Datenflusskomponente.

Festlegen der UITypeName-Eigenschaft

Für die Bereitstellung einer benutzerdefinierten Benutzeroberfläche muss der Entwickler die UITypeName-Eigenschaft von DtsPipelineComponentAttribute auf den Namen einer Klasse festlegen, die die IDtsComponentUI-Schnittstelle implementiert. Bei Festlegung dieser Eigenschaft durch die Komponente wird die benutzerdefinierte Oberfläche von SQL Server Integration Services geladen und aufgerufen, wenn die Komponente im SSIS-Designer bearbeitet wird.

Die UITypeName-Eigenschaft ist eine durch Trennzeichen getrennte Zeichenfolge, die den vollqualifizierten Namen des Typs angibt. Die folgende Liste zeigt die Elemente, die den Typ identifizieren, in Reihenfolge, an:

  • Name des Typs

  • Assemblyname

  • Dateiversion

  • Kultur

  • Öffentliches Schlüsseltoken

Im folgenden Codebeispiel wird eine Klasse veranschaulicht, die von der PipelineComponent-Basisklasse abgeleitet wird und die die UITypeName-Eigenschaft angibt.

[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

Implementieren der IDtsComponentUI-Schnittstelle

Die IDtsComponentUI-Schnittstelle enthält Methoden, die der SSIS-Designer aufruft, wenn eine Komponente hinzugefügt, gelöscht oder bearbeitet wird. Komponentenentwickler können zur Interaktion mit den Benutzern der Komponente Code in der Implementierung dieser Methoden bereitstellen.

Diese Klasse wird in der Regel in einer Assembly implementiert, die von der Komponente selbst getrennt ist. Die Verwendung einer separaten Assembly ist zwar nicht erforderlich, doch dadurch kann der Entwickler die Komponente und die Benutzeroberfläche unabhängig voneinander erstellen und bereitstellen, und der Speicherbedarf der Komponente wird gering gehalten.

Durch die Implementierung einer benutzerdefinierten Benutzeroberfläche hat der Komponentenentwickler mehr Steuerungsmöglichkeiten für die Komponente, wenn diese im SSIS-Designer bearbeitet wird. So kann die Komponente Code zu der New-Methode hinzufügen, die aufgerufen wird, wenn eine Komponte erstmals zum Datenflusstask hinzugefügt wird, und einen Assistenten anzeigen, der den Benutzer durch die anfängliche Konfiguration der Komponente begleitet.

Nachdem Sie eine Klasse erstellt haben, die die IDtsComponentUI-Schnittstelle implementiert, müssen Sie Code hinzufügen, mit dem auf Interaktionen der Benutzer mit der Komponente reagiert wird. Die Initialize-Methode stellt die IDTSComponentMetaData100-Schnittstelle der Komponente bereit und wird vor den New- und Edit-Methoden aufgerufen. Dieser Verweis sollte in einer privaten Membervariablen gespeichert und zur anschließenden Änderung der Metadaten der Komponente verwendet werden.

Ändern einer Komponente und Beibehalten von Änderungen

Die IDTSComponentMetaData100-Schnittstelle wird der Initialize-Methode als Parameter bereitgestellt. Dieser Verweis sollte in einer Membervariablen vom Benutzeroberflächencode zwischengespeichert werden und dann verwendet werden, um die Komponente als Reaktion auf Interaktionen der Benutzer mit der Benutzeroberfläche zu ändern.

Obwohl Sie die Komponente direkt über die IDTSComponentMetaData100-Schnittstelle ändern können, ist es vorteilhafter, eine Instanz von CManagedComponentWrapper mithilfe der Instantiate-Methode zu erstellen. Wenn Sie die Komponente direkt mithilfe der Schnittstelle bearbeiten, umgehen Sie die Schutzmaßnahmen zur Überprüfung der Komponente. Die Verwendung der Entwurfszeitinstanz der Komponente über CManagedComponentWrapper hat den Vorteil, sicherzustellen, dass die Komponente, die an ihr vorgenommenen Änderungen steuern kann.

Der Rückgabewert der Edit-Methode bestimmt, ob die an einer Komponente vorgenommenen Änderungen beibehalten oder verworfen werden. Wenn diese Methode false zurückgibt, dann werden alle Änderungen verworfen; bei true werden die Änderungen an der Komponente beibehalten und durch eine Kennzeichnung angegeben, dass das Paket gespeichert werden muss.

Verwenden der Dienste des SSIS-Designers

Der IServiceProvider-Parameter der Initialize-Methode bietet Zugriff auf die folgenden Dienste des SSIS-Designers:

Dienst

Beschreibung

IDtsClipboardService

Wird verwendet, um zu bestimmen, ob die Komponente als Teil eines Kopier-/Einfüge- oder Ausschneide-/Einfügevorgangs generiert wurde.

IDtsConnectionService

Wird verwendet, um auf vorhandene Verbindungen zuzugreifen oder neue Verbindungen im Paket zu erstellen.

IErrorCollectionService

Wird verwendet, um Ereignisse von Datenflusskomponenten aufzuzeichnen, wenn Sie alle Fehler und Warnungen, die von der Komponente ausgelöst wurden, erfassen, und nicht nur den letzten Fehler oder die letzte Warnung, empfangen müssen.

IDtsVariableService

Wird verwendet, um auf vorhandene Variablen zuzugreifen oder neue Variablen im Paket zu erstellen.

IDtsPipelineEnvironmentService

Wird von Datenflusskomponenten für den Zugriff auf den übergeordneten Datenflusstask und andere Komponenten im Datenfluss verwendet. Diese Funktion könnte z. B. verwendet werden, um eine Komponente wie den Assistent für langsam veränderliche Dimensionen zu entwickeln, der bei Bedarf zusätzliche Datenflusskomponenten erstellt und verbindet.

Diese Dienste bieten Komponentenentwicklern die Möglichkeit, Objekte in dem Paket, in das die Komponete geladen ist, zu erstellen bzw. auf diese zuzugreifen.

Beispiel

Im folgenden Codebeispiel wird die Integration einer benutzerdefinierten Benutzeroberflächenklasse gezeigt, die die IDtsComponentUI-Schnittstelle implementiert, sowie ein Windows Form, das als Editor für eine Komponente dient.

Benutzerdefinierte Benutzeroberflächenklasse

Das folgende Codebeispiel zeigt die Klasse, die die IDtsComponentUI-Schnittstelle implementiert. Die Edit-Methode erstellt den Komponenten-Editor und zeigt dann das Formular an. Der Rückgabewert des Formulars bestimmt, ob die an der Komponente vorgenommenen Änderungen beibehalten werden.

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

Benutzerdefinierter Editor

Das folgende Codebeispiel zeigt die Implementierung des Windows Form, das während des Aufrufs der Edit-Methode angezeigt wird.

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
Integration Services (kleines Symbol) Bleiben Sie mit Integration Services auf dem neuesten Stand

Die neuesten Downloads, Artikel, Beispiele und Videos von Microsoft sowie ausgewählte Lösungen aus der Community finden Sie auf MSDN auf der Integration Services-Seite:


Abonnieren Sie die auf der Seite verfügbaren RSS-Feeds, um automatische Benachrichtigungen zu diesen Updates zu erhalten.

Siehe auch

Konzepte

Erstellen einer benutzerdefinierten Datenflusskomponente