我正在尝试从我的脚本组件转换中的PipelineBuffer获取列名和索引是SSIS并将它们添加到Hashtable。我知道如果我将课程从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);
}
}
然而;当我这样做时,我不能再覆盖:public override void Input0_ProcessInputRow(Input0Buffer Row)
因为这在PipelineComponent类中不可用,我不能再通过调用类似这样的东西来访问我的连接管理器:IDTSConnectionManager100 connMgr = this.Connections.DbConnection;
从我看到的内容UserComponent类中没有BufferManager。有没有办法使用UserComponent来实现这个目的?
答案 0 :(得分:6)
我的好友和我一起工作。您可以像下面这样获取脚本缓冲区中列的名称:
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