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

Why does FireError fail in C# 2012, but works in VB, while FireInformation works in both?

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

The best overloaded method match for 'Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSComponentMetaData100.FireError(int, string, string, string, int, out bool)' has some invalid arguments

当我尝试这样做时:

    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# 代码,正如 回答的那样,但我得到的错误是在设计时 -- Visual Studio 在我编译之前出现了较早的 "invalid arguments" 错误,因此它知道有什么问题。

想法?

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

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

没有必要明确指定参数是通过引用,因为这似乎是在定义中完成的,而不是 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让你为所欲为
  • 组件中的错误事件有一个取消参数