为数据流组件开发用户界面

组件开发人员可以为组件提供自定义用户界面,编辑该组件时,此界面会显示在 Business Intelligence Development Studio 中。通过实现自定义用户界面,您可以在组件添加到数据流任务中或从数据流任务中删除以及请求该组件的帮助时获得通知。

如果没有为您的组件提供自定义用户界面,用户仍然可以配置该组件及其自定义属性,方法是使用“高级编辑器”。您可以根据需要使用 IDTSCustomProperty100TypeConverterUITypeEditor 属性确保高级编辑器允许用户适当地编辑自定义属性值。有关详细信息,请参阅数据流组件的设计时方法中的“创建自定义属性”。

设置 UITypeName 属性

若要提供自定义用户界面,开发人员必须将 DtsPipelineComponentAttributeUITypeName 属性设置为实现 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 接口,并在调用 NewEdit 方法之前调用。此引用应存储在私有成员变量中,然后用于修改组件的元数据。

修改组件并使更改持久化

IDTSComponentMetaData100 接口作为一个参数提供给 Initialize 方法。此引用应由用户界面代码缓存在成员变量中,然后用于修改组件以响应用户与用户界面的交互。

虽然可以通过 IDTSComponentMetaData100 接口直接修改组件,但是最好使用 Instantiate 方法创建一个 CManagedComponentWrapper 实例。使用该接口直接编辑组件时,将绕过组件的验证保护。通过 CManagedComponentWrapper 使用组件的设计时实例的优点是可以确保组件可以控制对它的更改。

Edit 方法的返回值确定对组件的更改是持久的还是被放弃。此方法返回 false 时,所有更改都被放弃;返回 true 时,将持久化对组件的更改并将包标记为需要保存。

使用 SSIS 设计器的服务

使用 Initialize 方法的 IServiceProvider 参数可以访问 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

自定义编辑器

下面的代码演示在调用 Edit 方法的过程中显示的 Windows 窗体的实现。

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 图标(小) 使 Integration Services 保持最新

若要从 Microsoft 获得最新的下载内容、文章、示例和视频,以及从社区获得所选解决方案,请访问 MSDN 或 TechNet 上的 Integration Services 页:

若要获得有关这些更新的自动通知,请订阅该页上提供的 RSS 源。