2014-03-30 39 views
1

我試圖從我的腳本組件轉換中的PipelineBuffer獲取列名和索引,並將它們添加到散列表。我知道如果我改變類從,這是可能的:public class ScriptMain : UserComponentScriptMain : PipelineComponent和使用此代碼:從SSIS 2012中的腳本組件中的PipelineBuffer獲取列名稱

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;從我所看到的BufferManager在UserComponent中不可用類。有沒有辦法使用UserComponent來完成此操作?

回答

3

我的好友和我一起工作過。你可以得到該列在腳本緩衝區來像這樣的名字:

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從輸入管道緩衝區映射到腳本緩衝區索引添加索引:N與輸入管道緩衝區的列,你需要創建一個類屬性的索引鏈接這件事:

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