2

SSIS C# スクリプト コンポーネント (データ フロー内) にネイティブ エラー処理を追加しようとしています。今、私はそれを強制的に 1/0 でコンポーネントをクラッシュさせますが、これは機能しますが、ハックです。

私のスクリプトは入力データに対していくつかのジャズを実行しますが、いくつかのステップでそれを検証し、検証が失敗した場合はコンポーネントを失敗させたいと考えています。ソースは選択なので、トランザクションなどをロールバックする必要はありません...しかし、コンポーネントがデータフローを失敗させて、データフローコンポーネントが失敗し、制御フローで規定するエラー処理に従うようにしたいと思います。

これは、私を支えている単純な関連スニペットです。

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;

[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{


public override void PreExecute()
{
    base.PreExecute();
    /*
      Add your code here for preprocessing or remove if not needed
    */

    bool pbCancel = false;
    ////check Row Count>0
    if (Variables.WeeklyLRrowCount == 0)
        this.ComponentMetaData.FireError(-1, "", "Fails Validation due to Empty Table.", "", 0, out pbCancel);
}

public override void PostExecute()
{
    base.PostExecute();
    /*
      Add your code here for postprocessing or remove if not needed
      You can set read/write variables here, for example:
      Variables.MyIntVar = 100
    */

}

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    /*
      Add your code here
    */

}


}

SSIS から次の情報を取得します。

"The name 'FireError' does not exist in the current context."

私がここに欠けているものはありますか?

ありがとう!

4

2 に答える 2

2

コードを PostExecute メソッドに移動するだけです。

于 2012-05-31T16:55:03.857 に答える
0

「通常、コンポーネントの設計中に、FireError、FireInformation、および FireWarning メソッドが呼び出され、コンポーネントが正しく構成されていない場合にユーザー フィードバックを提供します。」

http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.dts.runtime.idtscomponentevents(v=sql.105).aspx

これを正しく読んだ場合、これはスクリプト タスクで実行時に使用するためのものではなく、設計時にカスタム コンポーネントを使用して構成エラーを示すためのものです。

http://msdn.microsoft.com/en-us/library/ms135912(v=sql.105).aspxからのこのコードは、 あなたが望むものかもしれません。

public override void RegisterEvents()
{
string [] parameterNames = new string[2]{"RowCount", "StartTime"};
ushort [] parameterTypes = new ushort[2]{ DtsConvert.VarTypeFromTypeCode(TypeCode.Int32),   DtsConvert.VarTypeFromTypeCode(TypeCode.DateTime)};
string [] parameterDescriptions = new string[2]{"The number of rows to sort.", "The start time of the Sort operation."};
EventInfos.Add("StartingSort","Fires when the component begins sorting the rows.",false,ref parameterNames, ref paramterTypes, ref parameterDescriptions);
}
public override void ProcessInput(int inputID, PipelineBuffer buffer)
{
while (buffer.NextRow())
{
   // Process buffer rows.
}

IDTSEventInfo100 eventInfo = EventInfos["StartingSort"];
object []arguments = new object[2]{buffer.RowCount, DateTime.Now };
ComponentMetaData.FireCustomEvent("StartingSort", "Beginning sort operation.", ref arguments, ComponentMetaData.Name, ref FireSortEventAgain);
}
于 2012-05-31T17:14:59.463 に答える