zoukankan      html  css  js  c++  java
  • 如何在同步转换组件中增加输出列

    上一篇我们演示了一个比较简单的同步转换组件的开发,它的功能甚至都用不着我们开发这个组件:它是把字符转成大写。

    这样的需求的确可以通过派生列的方式来完成。我们讲解这个简单的例子主要是演示开发同步转换组件的流程。

    这一篇我们还需要继续讨论开发同步转换组件的问题。

    问题就是:我们能不能在转换之时添加自己的输出列?答案是:可以

    下面演示的例子是在每一行中加一个列,显示时间戳信息。

    1. 修改ProvideComponentProperties 方法。黑色大字体的部分,是增加了一个输出列的定义

            /// <summary>
            /// 这个方法提供组件必须的一些属性。
            /// 这里主要给默认的输入和输出重命名,让它更加形象
            /// </summary>
            public override void ProvideComponentProperties()
            {
                base.ProvideComponentProperties();
                ComponentMetaData.InputCollection[0].Name = "大写转换输入";
                ComponentMetaData.OutputCollection[0].Name = "大写转换输出";
                //ComponentMetaData.OutputCollection[1].SynchronousInputID = ComponentMetaData.InputCollection[0].ID;
                //如果调用了base.ProvideComponentProperties,则可以省略这句代码
    
    
                IDTSOutputColumn90 timestampColumn = ComponentMetaData
                    .OutputCollection[0].OutputColumnCollection.New();
    
                timestampColumn.Name = "时间戳";
                timestampColumn.SetDataTypeProperties(DataType.DT_WSTR, 50, 0, 0, 0);
    
            }

    2. 修改PreExecute方法

            List<int> _columns = new List<int>();//这个集合来保存需要处理的列的索引号
            int timestampColumnindex;
            /// <summary>
            /// 这个方法是ProcessInput之前的准备工作。
            /// 我们检测所有输入列中类型为字符型的,并将它的索引号记录起来
            /// 为了让ProcessInput能使用到这个信息,我们定义一个公用变量
            /// </summary>
            public override void PreExecute()
            {
                IDTSInput90 input = ComponentMetaData.InputCollection[0];
                IDTSInputColumnCollection90 columns = input.InputColumnCollection;
    
                foreach (IDTSInputColumn90 item in columns)
                {
                    if (item.DataType == DataType.DT_WSTR || item.DataType == DataType.DT_STR)
                    {
                        _columns.Add(BufferManager.FindColumnByLineageID(input.Buffer, item.LineageID));
                    }
                }
    
                IDTSOutput90 output = ComponentMetaData.OutputCollection[0];
                IDTSOutputColumn90 column = output.OutputColumnCollection[0];
                timestampColumnindex = BufferManager.FindColumnByLineageID(input.Buffer, column.LineageID);
                //一定要注意,因为是同步输出,所以这里查找仍热是在input.buffer里面找,而不是output.buffer
    //也就是说,至于遇到了异步转换,才会另外创建一个buffer,否则是使用同一个buffer
    
            }

    3.  修改ProcessInput方法

            public override void ProcessInput(int inputID, PipelineBuffer buffer)
            {
                while (buffer.NextRow())
                {
                    foreach (int index in _columns)
                    {
                        string str = buffer.GetString(index);
                        
                        buffer.SetString(index, str.ToUpper());
                        
                    }
                    buffer.SetString(timestampColumnindex, DateTime.Now.ToString());
    
    
                }
            }
    

    4. 重新编译,部署

    image

    image

    最后输出的文本文件如下

    image

    本文由作者:陈希章 于 2009/6/21 20:21:42 发布在:http://www.cnblogs.com/chenxizhang/
    本文版权归作者所有,可以转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    更多博客文章,以及作者对于博客引用方面的完整声明以及合作方面的政策,请参考以下站点:陈希章的博客中心
  • 相关阅读:
    PHP Laravel Install and Quickstart
    PHP Composer
    PHP学习 Cookie和Session
    PHP学习 Object Oriented 面向对象 OO
    PHP学习 例外和错误处理
    PHP学习 文件访问和写入
    PHP学习 函数 function
    PHP学习 流程控制和数组
    修改docker镜像地址为阿里云
    通信对象 System.ServiceModel.Channels.ServiceChannel 无法用于通信,因为其处于“出错”状态
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/1507911.html
Copyright © 2011-2022 走看看