我在Visual Studio 2014中有一个SSIS包,并且如果任何记录遍历第3方转换中的特定路径,我想在脚本组件中引发错误。我想在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在编译之前会弹出早期的“无效参数”错误,所以知道有什么问题了。
有什么想法吗?
最佳答案
您可能会混淆用于从脚本组件(数据流任务)与脚本任务(控制流)触发错误与信息事件的相似但不同的语法。 Component的智能感知指示参数为pbCancel,而fireAgain对应于信息任务的参数。
脚本组件
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让您做任何事
组件中的错误事件具有取消参数