1

スクリプト コンポーネントの変換で 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;私が見ることができることから、BufferManager は UserComponent クラスでは使用できません。UserComponent を使用してこれを達成する方法はありますか?

4

1 に答える 1

7

私の仲間は私と一緒にこれをやり遂げました。次のように、スクリプト バッファに入ってくる列の名前を取得できます。

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
于 2014-03-31T19:28:49.220 に答える