Разработка пользовательского интерфейса для компонента потока данных
Область применения: среда выполнения интеграции SSIS SQL Server в Фабрика данных Azure
Разработчики компонентов могут предоставить пользовательский пользовательский интерфейс для компонента, который отображается в SQL Server Data Tools (SSDT) при изменении компонента. Реализация пользовательского интерфейса обеспечивает возможность получать уведомления, когда компонент добавляется или удаляется из задачи потока данных или при вызове справки по компоненту.
Если не создать для компонента пользовательский интерфейс, пользователи смогут настраивать компонент и его свойства с помощью расширенного редактора. Можно при необходимости убедиться, что расширенный редактор позволяет пользователям правильно изменять значения пользовательских свойств, с помощью свойств TypeConverter и UITypeEditor интерфейса IDTSCustomProperty100. Дополнительные сведения см. в пункте "Создание пользовательских свойств" раздела Методы времени разработки для компонента потока данных.
Указание свойства UITypeName
Чтобы обеспечить пользовательский интерфейс, разработчик должен указать в качестве свойства UITypeName атрибута DtsPipelineComponentAttribute имя класса, реализующего интерфейс IDtsComponentUI. Если это свойство задано компонентом, службы SQL Server Integration Services загружают и вызывают пользовательский пользовательский интерфейс при изменении компонента в конструкторе служб SSIS.
Свойство UITypeName представляет собой разделенную запятыми строку, указывающую полное имя типа. В следующем списке показаны по порядку элементы, указывающие тип.
Введите имя
Имя сборки
Версия файла
Культура
Токен открытого ключа
В следующем примере кода показан класс, производный от базового класса PipelineComponent и задающий свойство 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
Реализация интерфейса IDtsComponentUI
Интерфейс IDtsComponentUI содержит методы, которые конструктор служб SSIS вызывает при добавлении, удалении и изменении компонента. Разработчики компонентов могут включить в свои реализации код этих методов для взаимодействия с пользователями компонента.
Этот класс обычно реализуется в сборке, отдельной от самого компонента. Хотя использование отдельной сборки необязательно, это позволяет разработчикам создавать и развертывать компонент и пользовательский интерфейс независимо, а также сохранять небольшой размер двоичного кода компонента.
Реализация пользовательского пользовательского интерфейса дает разработчику компонентов больше контроля над компонентом, так как он редактируется в конструкторе служб SSIS. Например, компонент может добавить код в метод New, который вызывается при первом добавлении компонента в задачу потока данных, и открыть мастер, помогающий пользователю выполнить первичную настройку компонента.
После создания класса, реализующего интерфейс IDtsComponentUI, необходимо добавить код, отвечающий на взаимодействие пользователя с компонентом. Метод Initialize предоставляет интерфейс IDTSComponentMetaData100 компонента и вызывается перед методами New и Edit. Эта ссылка должна быть сохранена в переменной закрытого члена класса и использоваться для последующих изменений метаданных компонента.
Изменение компонента и устойчивые изменения
Интерфейс IDTSComponentMetaData100 передается в качестве параметра методу Initialize. Эта ссылка должна кэшироваться в переменной члена кодом пользовательского интерфейса, а затем использоваться для изменения компонента в ответ на взаимодействие пользователя с интерфейсом.
Хотя можно изменить компонент напрямую с помощью интерфейса IDTSComponentMetaData100, лучше создать экземпляр CManagedComponentWrapper с помощью метода Instantiate. При непосредственном изменении компонента с помощью интерфейса проверочная защита компонента обходится. Преимуществом использования экземпляра среды разработки для проектирования компонента с помощью CManagedComponentWrapper является возможность удостовериться, что компонент может управлять внесенными в него изменениями.
Возвращаемое значение метода Edit определяет, сохранились ли или отменены изменения, внесенные в компонент. Если метод возвращает значение false, все изменения отменяются; при значении true изменения в компоненте сохраняются, а пакет помечается как нуждающийся в сохранении.
Использование служб конструктора служб SSIS
Параметр Initialize IServiceProvider метода предоставляет доступ к следующим службам конструктора служб SSIS:
Служба | Description |
---|---|
IDtsClipboardService | Используется для определения, был ли компонент создан в ходе операции копирования и вставки или вырезания и вставки. |
IDtsConnectionService | Используется для доступа к существующим соединениям или для создания новых соединений в пакете. |
IErrorCollectionService | Используется для получения событий из компонентов потока данных, если требуется зафиксировать все возникающие ошибки и предупреждения, а не только получить последнее сообщение об ошибке или предупреждение. |
IDtsVariableService | Используется для доступа к существующим переменным или для создания новых переменных в пакете. |
IDtsPipelineEnvironmentService | Используется компонентами потока данных для доступа к родительской задаче потока данных и другим компонентам в потоке данных. Эту функцию можно использовать для разработки такого компонента, как мастер медленно изменяющихся измерений, при необходимости создающего дополнительные компоненты потока данных. |
Эти службы предоставляют разработчикам компонентов возможность доступа к объектам и создания объектов в пакете, в котором загружен компонент.
Пример
В следующем примере кода показана интеграция класса пользовательского интерфейса, реализующего интерфейс IDtsComponentUI, и форма Windows, служащая редактором компонента.
Собственный класс пользовательского интерфейса
В следующем примере кода показан класс, реализующий интерфейс IDtsComponentUI. Метод Edit создает редактор компонента и отображает форму. Возвращаемое формой значение определяет, сохраняются ли изменения, внесенные в компонент.
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
Пользовательский редактор
В следующем примере кода показана реализация формы Windows, отображающейся во время вызова метода 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