Поделиться через


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

Область применения: среда выполнения интеграции 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  

См. также

Создание пользовательского компонента потока данных