2014-10-22 4 views
3

При запуске событий Integration Services из сценария я немного споткнулся о методе FireInformation из свойства Microsoft.SqlServer.Dts.Tasks.ScriptTask.EventsObjectWrapper Dts в Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase. Последний параметр, fireAgain, передается по ссылке. documentation объясняет: «Истина, чтобы продолжить стрельбу, в противном случае - ложь». Зачем передавать параметр по ссылке? Существуют ли условия, когда метод устанавливает значение true и требует, чтобы вызывающий абонент повторил вызов? Если вызывающий абонент устанавливает значение в значение false, каковы последствия?Какова цель параметра fireAgain в методе Dts.Events.FireInformation?

+0

Мое быстрое предположение, потому что я не знаю наверняка, является то, что это функция для тех, кто реализует свой собственный [пользовательский поставщик протоколирования] (http://msdn.microsoft.com/en-us/library/ ms136010.aspx). – billinkc

+0

@billinkc, можете ли вы объяснить, почему вы думаете, что пользовательский поставщик протоколирования является родным? Если да, то почему параметр используется только для метода FireInformation, а не для других событий? –

ответ

1

Причина, по которой FirstInformation предоставляет механизм для подавления дальнейших событий, - это стоимость. Привлечение событий может быть дорогостоящим и учитывая, что по определению эти сообщения носят информационный характер, имеет смысл разрешить поставщикам журналов или настраивать задачи, чтобы остановить поднятие события.

От IDTSComponentEvents.FireInformation Method

Поскольку обжиг событие может быть дорогостоящим, бег времени двигатель обеспечивает механизм подавления событий, которые вы не заинтересованы. Каждый метод стрельбы событие имеет параметр FireAgain. Если значение этой переменной равно false, то после возвращения метода вызывающий объект не будет запускать это событие еще раз для продолжительности текущего выполнения.

+1

Ну, это сложно. Я думаю, что ваш ответ указывает в сторону, но документация оставляет меня в замешательстве и желании. Не каждый метод события имеет параметр fireAgain. FireError возвращает логическое значение, а не параметр. FireWarning не обеспечил ни одного. Строка: «Если значение переменной ложно, то после возвращения метода вызывающий объект не будет запускать это событие снова ...», трудно интерпретировать. Мне позволено подумать, нужно ли это быть императивом. Я не нашел примеров, специально обрабатывающих это условие. –

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 и было бы интересно увидеть случай, когда возвращаемое значение на самом деле ложь.