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

时间:2015-03-06 20:21:24

标签: c# vb.net visual-studio ssis sql-server-2012

我在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#代码,因为this stackoverflow question已经回答,但我得到的错误是在设计时 - Visual Studio spring较早的"无效的论点"我编译之前的错误,所以它知道某些东西已经关闭。

思想?

2 个答案:

答案 0 :(得分:3)

您可能会混淆类似但不同的语法,用于从脚本组件(数据流任务)与脚本任务(控制流)触发错误与信息事件。 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 Clarification

脚本任务

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允许你做任何事情
  • 组件中的错误事件具有取消参数

答案 1 :(得分:2)

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