上一篇我们演示了一个比较简单的同步转换组件的开发,它的功能甚至都用不着我们开发这个组件:它是把字符转成大写。
这样的需求的确可以通过派生列的方式来完成。我们讲解这个简单的例子主要是演示开发同步转换组件的流程。
这一篇我们还需要继续讨论开发同步转换组件的问题。
问题就是:我们能不能在转换之时添加自己的输出列?答案是:可以
下面演示的例子是在每一行中加一个列,显示时间戳信息。
1. 修改ProvideComponentProperties 方法。黑色大字体的部分,是增加了一个输出列的定义
///
/// 这个方法提供组件必须的一些属性。
/// 这里主要给默认的输入和输出重命名,让它更加形象
///
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;
///
/// 这个方法是ProcessInput之前的准备工作。
/// 我们检测所有输入列中类型为字符型的,并将它的索引号记录起来
/// 为了让ProcessInput能使用到这个信息,我们定义一个公用变量
///
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. 重新编译,部署
最后输出的文本文件如下