为什么FireError在C#2012中失败,但是在VB中工作,而FireInformation在两者中都有效?

我在Visual Studio 2014中有一个SSIS包,如果任何记录遍历第三方转换中的特定路径,我想在脚本组件中引发错误。 我想在C#2012中执行此操作,但FireError方法会出错:

‘Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSComponentMetaData100.FireError(int,string,string,string,int,out bool)’的最佳重载方法匹配有一些无效的参数

当我尝试这样做时:

bool fireAgain = false; IDTSComponentMetaData100 myMetaData; myMetaData = this.ComponentMetaData; myMetaData.FireError(0, "Script Component", "Invalid Records", string.Empty, 0, ref fireAgain); 

但如果我将FireError更改为FireInformation,它会编译并运行 – 当然我需要引发错误,而不是提供信息。

另外,如果我使用Visual Basic而不是C#:

  Dim pbFireAgain As Boolean = False Dim myMetaData As IDTSComponentMetaData100 myMetaData = Me.ComponentMetaData myMetaData.FireError(0, "Script Component", "Invalid Records", String.Empty, 0, pbFireAgain) 

也就是说,我的意思是,字面意思完全一样,但在不同的语言中,它运作正常。 VB也适用于FireInformation。

显然我可以通过使用VB来解决我的直接问题,但有人可以告诉我为什么这是这样的? 这似乎是C#的一个特定问题。 作为证据,我们在MSDN上有这个: https : //msdn.microsoft.com/en-us/library/ms136031.aspx

FireError的脚本组件版本只是八个没有C# VB版本的示例(日志记录版本格式不佳,但它们都在那里)。

我想知道是否有一个调试器配置可能以奇怪的方式运行C#代码,因为这个stackoverflow问题已经回答,但是我得到的错误是在设计时 – Visual Studio在编译之前弹出了早期的“无效参数”错误,所以它知道有些东西是关闭的。

思考?

您可能会混淆类似但不同的语法,用于从脚本组件(数据流任务)与脚本任务(控制流)中触发错误与信息事件。 Component的intellisense指示参数是pbCancel而fireAgain对应于Information Task的参数。

脚本组件

C#脚本组件示例

 public override void Input0_ProcessInputRow(Input0Buffer Row) { bool cancel = false; bool fireAgain = false; this.ComponentMetaData.FireInformation(0, "My sub", "info", string.Empty, 0, ref fireAgain); this.ComponentMetaData.FireError(0, "My sub", "error", string.Empty, 0, out cancel); } 

VB组件

 Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer) Dim cancel As Boolean Dim fireAgain As Boolean Me.ComponentMetaData.FireInformation(0, "my sub", "info", String.Empty, 0, fireAgain) Me.ComponentMetaData.FireError(0, "I hate vb", "Error", String.Empty, 0, cancel) End Sub 

没有必要明确指定参数是By Reference,因为这似乎是在定义与C#需求中完成的,以便在调用时也指定它。 ByRef vs ByVal澄清

脚本任务

C#

  public void Main() { bool fireAgain = false; this.Dts.Events.FireInformation(0, "my sub", "info", string.Empty, 0, ref fireAgain); // Note, no cancel available this.Dts.Events.FireError(0, "my sub", "error", string.Empty, 0); } 

VB

 Public Sub Main() Dim fireAgain As Boolean = False Me.Dts.Events.FireInformation(0, "my sub", "info desc", String.Empty, 0, fireAgain) Me.Dts.Events.FireError(0, "my sub", "error desc", String.Empty, 0) Dts.TaskResult = ScriptResults.Success End Sub 

摘要

  • C#要求您指定refout关键字。 它们不是同义词
  • VB让你做任何事情
  • Components中的错误事件具有取消参数

你在C#中通过ref传递它,而不是传递它。 我不认为VB.NET需要那些关键字。