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 |
---|---|
Wird verwendet, um zu bestimmen, ob die Komponente als Teil eines Kopier-/Einfüge- oder Ausschneide-/Einfügevorgangs generiert wurde. |
|
Wird verwendet, um auf vorhandene Verbindungen zuzugreifen oder neue Verbindungen im Paket zu erstellen. |
|
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. |
|
Wird verwendet, um auf vorhandene Variablen zuzugreifen oder neue Variablen im Paket zu erstellen. |
|
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
|