c# - 从 SSIS 2012 脚本组件中的 PipelineBuffer 获取列名称

标签 c# ssis script-component

我试图从脚本组件转换为 SSIS 的 PipelineBuffer 中获取列名称和索引,并将它们添加到哈希表中。我知道这是可能的,如果我将我的类从:public class ScriptMain : UserComponent 更改为 ScriptMain : PipelineComponent 并使用此代码:

public override void ProcessInput(int InputID, Microsoft.SqlServer.Dts.Pipeline.PipelineBuffer Buffer)
{
    inputBuffer = Buffer;
    hash = new Hashtable();
    IDTSInput100 i = ComponentMetaData.InputCollection.GetObjectByID(InputID);
    foreach (IDTSInputColumn100 col in i.InputColumnCollection)
    {
        int colIndex = BufferManager.FindColumnByLineageID(i.Buffer, col.LineageID);
        hash.Add(col.Name, colIndex);
    }
}

但是;当我这样做时,我不能再覆盖: IDTSConnectionManager100 connMgr = this.Connections.DbConnection; 据我所知,BufferManager 在 UserComponent 类中不可用。有没有办法使用 UserComponent 来完成此操作?

最佳答案

我的好友与我一起解决了这个问题。您可以像这样获取脚本缓冲区中列的名称:

public override void Input0_ProcessInputRow(Input0Buffer inputBufferRow)
     {
    foreach (IDTSInputColumn100 column in this.ComponentMetaData.InputCollection[0].InputColumnCollection)
            { 
              PropertyInfo columnValue = inputBufferRow.GetType().GetProperty(column.Name);
            }
       }

您可以通过在脚本组件中使用反射并将它们加载到过滤列表中来获取脚本缓冲区中的列索引和名称,如下所示:

IList<string> propertyList = new List<string>();
                    var properties = typeof(Input0Buffer).GetProperties();
                    foreach (var property in properties)
                    {
                        if (!property.Name.EndsWith("_IsNull"))
                            propertyList.Add(property.Name);
                    }

然后您可以使用 PropertyInfo 对象的名称访问列表以获取脚本缓冲区中的索引值:

int index = (propertyList.IndexOf(columnValue.Name));

为了将其与输入管道缓冲区中的列索引链接起来,您需要创建一个类属性:

int[] BufferColumnIndexes; 

然后覆盖 ProcessInput 并从映射到脚本缓冲区索引的输入管道缓冲区添加索引:

public override void ProcessInput(int InputID, Microsoft.SqlServer.Dts.Pipeline.PipelineBuffer Buffer)
    {
        inputBuffer = Buffer;
        BufferColumnIndexes = GetColumnIndexes(InputID);
        base.ProcessInput(InputID, Buffer);
    }

现在把它们联系起来:

int index = (propertyList.IndexOf(columnValue.Name)); //index in script buffer
int index2 = (BufferColumnIndexes[index]); //index in input pipeline buffer

关于c# - 从 SSIS 2012 脚本组件中的 PipelineBuffer 获取列名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22746994/

相关文章:

c# - 继承 ThreadStatic 值以在多线程上下文中的 C#/.NET 中实现动态作用域

sql - 动态表插入 SQL

ssis - 如果在SSIS中值为NULL,则条件拆分将失败

sql - SSIS DataFlowTask DefaultBufferSize 和 DefaultBufferMaxRows

sql-server - CS2001执行部署到服务器的SSIS包时缺少AssemblyAttributes.cs

C#、搜索字符串、ASP

c# - 从 wpf 中的其他窗口更改框架源

c# - 防止触发 CheckBox Checked 事件

c# - 如何在 SSIS 的数据流任务中添加增量行号

sql-server - SSIS 脚本组件或脚本任务写入作业历史日志