2

現在のパッケージは、Excelソース、スクリプトコンポーネント、およびOLEDB宛先で構成されています。私が達成しようとしているのは、私の列の1つを変換することだけです。この特定の列には、列のサブストリングが必要です。ただし、次のエラーメッセージが表示され続けます。

 There is no current row in the buffer. A row may need to be added using the AddRow method.
 at Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.HandleUserException(Exception e)

どういう意味ですか?データの変換だけを行っているのに、なぜ行を追加する必要があるのですか?SSISの全体像を見逃していますか?

スクリプト内の私のコードは次のとおりです。

    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
        OutBuffer.labortypewbs = Row.CopyofLevel2ProjectSegment.Substring(Row.CopyofLevel2ProjectSegment.Length - 2, 2);
    }

すべての助けをありがとう!

4

2 に答える 2

3

スクリプトコンポーネントではなく、派生列を使用してみませんか。既存の列のサブストリングである列をそのコンポーネントで簡単に追加でき、コードを記述したり、スクリプトコンポーネントプログラミングの複雑さを学習したりする必要はありません。次の場合にのみスクリプトコンポーネントを使用します。

  1. 必要な変換を行うための既存のコンポーネントがない場合がありました。
  2. 私が使用する必要のあるコンポーネントは、使用するのに十分な速さまたは正確さ(証明付き)ではありませんでした。

スクリプトコンポーネントが最良の解決策であるといういくつかのエッジケースがありましたが、それらはごくわずかであり、サブストリングはそれらのケースの1つではありません。

于 2012-06-11T17:51:49.827 に答える
3

ウィリアムが示したように、派生列を使用してこれを達成できますが、実際に発生した問題の解決策について言及する価値があります。

出力列の値を設定する前に、まず新しい行を追加する必要があります。コードは次のようになります。

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    OutBuffer.AddRow();
    OutBuffer.labortypewbs = Row.CopyofLevel2ProjectSegment.Substring(Row.CopyofLevel2ProjectSegment.Length - 2, 2);
}
于 2016-06-30T16:56:50.360 に答える