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 回答