• 为SSIS编写自定义数据流组件(DataFlow Component)之进阶篇:自定义编辑器


    我们之前几篇讨论过自定义数据流组件的一些技术,分别如下

    本节,将继续讨论最有一个话题,就是说除了像如上那样提供自定义属性之外,是否还可以提供一个专门的组件编辑器。

    为什么需要说这个问题呢?

    如果大家对SSIS数据流组件比较熟悉的话,就知道每个组件都有两个编辑器。我们分别来看一下。下面我以Excel源为例

    image

    选择“编辑”之后

    image

    而选择“显示高级编辑器”之后

    image

    如果看过之前的几篇文章,大家对于“高级编辑器”应该是比较熟悉的。就是说,如果我们直接在ProvideComponentProperties方法中通过下面这样的方式添加属性的话,这些属性就会出现在高级编辑器的“组件属性”中。

    IDTSCustomProperty90 folder = ComponentMetaData.CustomPropertyCollection.New();
    folder.Name = "Folder";

    那么,我们回到这次讨论的问题。就是说,除了这个高级编辑器,另外一个编辑器应该怎么实现呢?当然,前提在于你的组件确实比较复杂,高级编辑器不能满足要求。(这句话说起来有点拗口,因为高级编辑器按理说应该是很高级的,呵呵)

    【注意】我倒是推荐你把所谓的高级编辑器理解为默认编辑器。

    根据我们之前为自定义任务项(Task)开发编辑器的经验,我们不难理解下面的一些步骤

    1. 创建一个实现了IDTSComponentUI接口的类型.该接口位于Microsoft.SqlServer.Dts.Pipeline.Design这个命名空间

        public class MyDataSourceUIEditor : IDtsComponentUI {
    
            #region IDtsComponentUI 成员
    
            public void Delete(System.Windows.Forms.IWin32Window parentWindow)
            {
    
            }
    
            public bool Edit(System.Windows.Forms.IWin32Window parentWindow, 
                Microsoft.SqlServer.Dts.Runtime.Variables variables, 
                Microsoft.SqlServer.Dts.Runtime.Connections connections)
            {
                //这里可以创建一个窗体,供用户去进行编辑
                return true;
            }
    
            public void Help(System.Windows.Forms.IWin32Window parentWindow)
            {
                System.Windows.Forms.Help.ShowHelp(null, "http://www.xizhang.com");
            }
    
    
    
            public void Initialize(IDTSComponentMetaData90 dtsComponentMetadata, 
                IServiceProvider serviceProvider)
            {
                
            }
    
            public void New(System.Windows.Forms.IWin32Window parentWindow)
            {
            }
    
            #endregion
        }

    2. 然后,在组件类上面进行指定关联

        [DtsPipelineComponent(
              ComponentType=ComponentType.SourceAdapter,
              Description="这是我的一个自定义数据源组件,它可以读取某个文件夹下面的文件信息",
              DisplayName="文件夹数据源",
              UITypeName = "MyDataFlowComponentSample.MyDataSourceUIEditor, MyDataFlowComponentSample, Version=1.0.0.0, 
    Culture=neutral, PublicKeyToken=5207ee26f0ac0166"
              )]

    确实就是如上的步骤。其实并不复杂,对吧。很多技术都是想通的。

    下面我来简单地实现一下这个编辑器。为此我需要添加一个新的窗体。

    image

    窗体代码大致如下

    using System;
    using System.Windows.Forms;
    using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
    using Microsoft.SqlServer.Dts.Runtime;
    
    
    namespace MyDataFlowComponentSample
    {
        public partial class MyDatasourceUIEditorForm : Form
        {
            public MyDatasourceUIEditorForm()
            {
                InitializeComponent();
            }
    
    
            IDTSComponentMetaData90 metaValue;
            Variables vars;
            Connections conns;
    
            /// <summary>
            /// 这个特殊的构造器可以让编辑器与具体的组件进行联系
            /// </summary>
            /// <param name="meta">这个代表了组件的元数据</param>
            /// <param name="variables">这是包中的变量</param>
            /// <param name="connections">这是包中的连接管理器</param>
            public MyDatasourceUIEditorForm(IDTSComponentMetaData90 meta, 
                Variables variables, Connections connections)
                : this()
            {
                metaValue = meta;
                vars = variables;
                conns = connections;
            }
    
            private void btOk_Click(object sender, EventArgs e)
            {
                metaValue.CustomPropertyCollection["Folder"].Value=@"E:\Temp";
                //作为演示目的,这里直接用代码给某个属性赋值
            }
        }
    }
    

    准备好这个窗体之后,我们再回过来修改一下UIEditor这个类型。

        public class MyDataSourceUIEditor : IDtsComponentUI {
    
            #region IDtsComponentUI 成员
    
            public void Delete(System.Windows.Forms.IWin32Window parentWindow)
            {
    
            }
    
    
    
            public bool Edit(System.Windows.Forms.IWin32Window parentWindow, 
                Microsoft.SqlServer.Dts.Runtime.Variables variables, 
                Microsoft.SqlServer.Dts.Runtime.Connections connections)
            {
                //这里可以创建一个窗体,供用户去进行编辑
    
                using (MyDatasourceUIEditorForm form = 
                    new MyDatasourceUIEditorForm(meta, variables, connections))
                {
                    return form.ShowDialog() == DialogResult.OK;
                }
            }
    
            public void Help(System.Windows.Forms.IWin32Window parentWindow)
            {
                System.Windows.Forms.Help.ShowHelp(null, "http://www.xizhang.com");
            }
    
    
            private IDTSComponentMetaData90 meta;
            public void Initialize(IDTSComponentMetaData90 dtsComponentMetadata, 
                IServiceProvider serviceProvider)
            {
                meta = dtsComponentMetadata;
                //这个dtsComponentMetadata可以连接到组件的元数据,这样就可以传递给编辑器窗口,进行属性的读写
            }
    
            public void New(System.Windows.Forms.IWin32Window parentWindow)
            {
            }
    
            #endregion
        }

    重新编译项目,然后部署。

    接下来我们在BI Studio中来看一下效果。我们选中组件,然后右键,编辑。果然看到了我们的窗体

    image

    点击“确定”按钮之后,该组件的Folder属性也确实修改为了“E:\Temp”

    image

    到这里为止,我们就为数据源组件实现了独立的编辑器。

    本文由作者:陈希章 于 2009/6/21 14:57:03 发布在:http://www.cnblogs.com/chenxizhang/
    本文版权归作者所有,可以转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    更多博客文章,以及作者对于博客引用方面的完整声明以及合作方面的政策,请参考以下站点:陈希章的博客中心
  • 相关阅读:
    Python-控制流
    字符串创建运算符#
    Python-操作符和表达式
    Python-基础数据类型
    重载、重写和隐藏
    java加载jdbc驱动三种方式的比较
    Mysql 索引复习笔记
    Java中如何指定跳出多重嵌套循环
    LeetCode第[2]题(Java):Add Two Numbers (链表相加)——Medium
    LeetCode第[26]题(Java):Remove Duplicates from Sorted Array 标签:Array
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/1507775.html
Copyright © 2020-2023  润新知