从脚本中触发Integration Services事件时,我在Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase上的Microsoft.SqlServer.Dts.Tasks.ScriptTask.EventsObjectWrapper Dts属性中偶然发现了FireInformation方法。最后一个参数fireAgain通过引用传递。 documentation解释说," True继续射击;否则,错误。"为什么通过引用传递参数?是否有方法将方法设置为true并要求调用者重复调用?如果调用者将值设置为false,会产生什么影响?
答案 0 :(得分:1)
FirstInformation提供抑制进一步事件的机制的原因是成本。提升事件的成本可能很高,并且根据定义,这些消息本质上是信息性的,允许日志提供者或自定义任务停止提升事件是有意义的。
来自IDTSComponentEvents.FireInformation Method
由于事件的触发可能很昂贵,因此运行时引擎提供了一种抑制您不感兴趣的事件的机制。每个事件触发方法都有一个FireAgain参数。如果此变量的值为false,则在方法返回后,调用方将不会在当前执行期间再次触发此事件。
答案 1 :(得分:0)
就像评论所说的那样,我认为关于事件方法的文档充其量是不一致的并且绝对令人困惑。我认为billinkc通过自定义日志记录提供程序向我们指出了一个有趣的方向。同样感兴趣的是关于handling events programmatically的文档。虽然示例没有具体说明调用者应如何处理fireAgain参数或返回值。我认为我们要尊重所有后续尝试触发类型事件的价值:自定义,错误,信息和进度。虽然在文档中有说明,"Every event firing method has a FireAgain parameter."但事实并非如此。 FireWarning不为FireAgain提供任何回报或参数。
在自定义ScriptTask中,您可能希望实现包装器方法来处理FireAgain参数或返回值。
private bool shouldFireCustomEvent = true;
private void TaskLevelFireCustomEvent(string eventName, string eventText, ref object[] arguments, string subComponent)
{
if (!shouldFireCustomEvent) { return; }
Dts.Events.FireCustomEvent(eventName, eventText, ref arguments, subComponent, ref shouldFireCustomEvent);
}
private bool shouldFireError = true;
private void TaskLevelFireError(int errorCode, string subComponent, string description, string helpFile, int helpContext)
{
if (!shouldFireError) { return; }
this.shouldFireError = Dts.Events.FireError(errorCode, subComponent, description, helpFile, helpContext);
}
private bool shouldFireInformation = true;
private void TaskLevelFireInformation(int informationCode, string subComponent, string description, string helpFile, int helpContext)
{
if (!shouldFireInformation) { return; }
Dts.Events.FireInformation(informationCode, subComponent, description, helpFile, helpContext, ref shouldFireInformation);
}
private bool shouldFireProgress = true;
private void TaskLevelFireProgress(string progressDescription, int percentComplete, int progressCountLow, int progressCountHigh, string subComponent)
{
if (!shouldFireProgress) { return; }
Dts.Events.FireProgress(progressDescription, percentComplete, progressCountLow, progressCountHigh, subComponent, ref shouldFireProgress);
}
private void TaskLevelFireWarning(int warningCode, string subComponent, string description, string helpFile, int helpContext)
{
Dts.Events.FireWarning(warningCode, subComponent, description, helpFile, helpContext);
}
在我的几个测试中,我没有看到包含的日志记录提供程序利用fireAgain参数,并且有兴趣看到返回值实际为false的情况。