2

H君。SSIS 用のカスタム コンポーネントを開発しています。入力の処理中に問題が発生しました。問題は、「ProcessInput」メソッドが複数回実行されることです。この場合は2回。

これはプロセス入力スニペットです。

public override void ProcessInput(int inputID, PipelineBuffer buffer)
{
    IDTSInput90 input = ComponentMetaData.InputCollection.GetObjectByID(inputID);
    if (input.InputColumnCollection.Count > 0)
    {
        while (buffer.NextRow())
        {
            try
            {
                for (int columnIndex = 0; columnIndex < input.InputColumnCollection.Count; columnIndex++)
                {

                    ColumnInfo columnInfo = _columnInfos[input.InputColumnCollection[columnIndex].ID];
                    IDTSInputColumn90 inputColumn = input.InputColumnCollection[columnIndex];
                    try
                    {
                        //write to destination
                    }
                    catch (Exception writeEx)
                    {
                        throw new Exception("Couldn't write to destination");
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
    else
    {
        throw new Exception("There is no columns in the input collection");
    }

}

2回呼び出される理由がわかりません。これはデータフローです:

データフロー http://img371.imageshack.us/img371/3001/dataflowprocessinputrb6.png

そして、これはマッピング ウィンドウです: マッピング ウィンドウ http://img78.imageshack.us/img78/3772/mappingprocessinputzs2.png

4

1 に答える 1

3

これは仕様によるものです。SSIS は、メモリ使用量を最適化するために、データをチャンク (SSIS 用語ではバッファー) で送信します。バッファー サイズは制限されているため、SSIS はすべてのデータをメモリに読み込む必要はありません (そうしないと、SSIS はテラバイト単位のデータを処理できません)。したがって、複数の ProcessInput 呼び出し (バッファーごとに 1 つの ProcessInput 呼び出し) を取得できます。

さらに、最後に EndOfRowset フラグが true に設定された空のバッファが 1 つ得られます。ただし、これに依存しないでください。これは実装の詳細です (最後のバッファーは EndOfRowset = true であると文書化されていますが、空であるとは文書化されていません)。

于 2009-01-12T16:32:04.763 に答える