为什么 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# 要求您指定
ref
和 out
关键字。它们不是同义词
- VB让你为所欲为
- 组件中的错误事件有一个取消参数
我在 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# 代码,正如
想法?
您在 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# 要求您指定
ref
和out
关键字。它们不是同义词 - VB让你为所欲为
- 组件中的错误事件有一个取消参数