Разработка пользовательского интерфейса для компонента потока данных

Разработчики компонентов могут включить для компонента пользовательский интерфейс, отображающийся в среде Business Intelligence Development Studio во время изменения компонента. Реализация пользовательского интерфейса обеспечивает возможность получать уведомления, когда компонент добавляется или удаляется из задачи потока данных или при вызове справки по компоненту.

Если не создать для компонента пользовательский интерфейс, пользователи смогут настраивать компонент и его свойства с помощью расширенного редактора. Можно при необходимости убедиться, что расширенный редактор позволяет пользователям правильно изменять значения пользовательских свойств, с помощью свойств TypeConverter и UITypeEditor интерфейса IDTSCustomProperty100. Дополнительные сведения см. в подразделе «Создание пользовательских свойств» раздела Методы времени разработки для компонента потока данных.

Указание свойства UITypeName

Чтобы обеспечить пользовательский интерфейс, разработчик должен указать в качестве свойства UITypeName атрибута DtsPipelineComponentAttribute имя класса, реализующего интерфейс IDtsComponentUI. Если это свойство задается компонентом, службы SQL ServerIntegration 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

Параметр IServiceProvider метода Initialize предоставляет доступ к следующим службам конструктора служб SSIS.

Служба

Описание

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
Значок служб Integration Services (маленький)Будьте в курсе новых возможностей cлужб Integration Services

Чтобы загружать новейшую документацию, статьи, образцы и видеоматериалы от корпорации Майкрософт, а также лучшие решения от участников сообщества, посетите страницу служб Integration Services на сайтах MSDN или TechNet:

Чтобы получать автоматические уведомления об этих обновлениях, подпишитесь на RSS-каналы, предлагаемые на этой странице.