Имитация вывода ошибок для компонента сценария
Хотя невозможно напрямую настроить вывод ошибок в компоненте сценария для автоматической обработки строк ошибок, можно воспроизвести функциональность встроенного вывода ошибок, создав дополнительный выход и используя условную логику в сценарии для направления строк на этот выход, когда это целесообразно. Возможно, потребуется имитация поведения встроенного вывода ошибок с помощью добавления двух дополнительных выходных столбцов для номера ошибки и идентификатора столбца, в котором эта ошибка возникла.
Если необходимо добавить описание ошибки, соответствующее конкретному стандартному коду ошибки служб Integration Services, можно использовать метод GetErrorDescription интерфейса IDTSComponentMetaData100, доступ к которому можно получить через свойство ComponentMetaData компонента сценария.
Примеры
В следующем примере используется компонент сценария, настроенный в качестве преобразования и имеющий два синхронных выхода. Этот компонент сценария предназначен для фильтрации строк ошибок в строках, содержащих адреса, в образце базы данных AdventureWorks. Вымышленная ситуация, рассматриваемая в этом примере, предполагает увеличение количества клиентов в Северной Америке, в результате чего возникает необходимость выполнить фильтрацию, исключающую адреса, расположенные за пределами Северной Америки.
Настройка примера
Перед созданием нового компонента сценария создайте диспетчер соединений и настройте источник потока данных, выбирающий адреса из образца базы данных AdventureWorks. В этом примере, где предусмотрено обращение только к столбцу CountryRegionName, можно просто использовать представление Person.vStateCountryProvinceRegion либо выбрать данные, соединив таблицы Person.Address, Person.StateProvince и Person.CountryRegion.
Добавьте новый компонент сценария в область конструктора потока данных и настройте его в качестве преобразования. Откройте Редактор преобразования «Сценарий».
На странице Сценарий задайте свойство ScriptLanguage, указав язык сценария, используемый для создания сценария.
Нажмите кнопку Изменить сценарий, чтобы открыть среду MicrosoftVisual Studio для приложений (VSTA).
В методе Input0_ProcessInputRow введите или вставьте следующий образец кода:
Закройте среду VSTA.
На странице Входные столбцы выберите столбцы, которые необходимо обработать в преобразовании «Сценарий». В этом примере используется только столбец CountryRegionName. Невыбранные доступные входные столбцы будут пропущены без изменения в потоке данных.
На странице Входы и выходы добавьте новый, второй выход и укажите в качестве значения его свойства SynchronousInputID идентификатор входа, используемый также в качестве значения свойства SynchronousInputID выхода по умолчанию. Присвойте свойству ExclusionGroup обоих выходов одно и то же ненулевое значение (например, 1), чтобы указать, что каждая строка должна быть направлена только в один из двух выходов. Дайте новому выводу ошибок понятное описательное имя, например MyErrorOutput.
Добавьте в новый вывод ошибок дополнительные выходные столбцы для отслеживания требуемых данных ошибок. В их число может входить код ошибки, идентификатор столбца, в котором возникла ошибка, а также, возможно, описание ошибки. В этом примере создаются новые столбцы, ErrorColumn и ErrorMessage. Если в реализации обрабатываются стандартные ошибки служб Integration Services, необходимо добавить столбец ErrorCode для номера ошибки.
Запишите значение идентификатора входного столбца или столбцов, которые должны проверяться компонентом сценария на наличие ошибок. В этом примере идентификатор столбца используется для заполнения значений в столбце ErrorColumn.
Закройте Редактор преобразования «Сценарий».
Соедините выходы компонента сценария с подходящими назначениями. Назначение «Плоский файл» проще всего для настройки тестирования в нерегламентированных случаях.
Запустите пакет.
Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
If Row.CountryRegionName <> "Canada" _
And Row.CountryRegionName <> "United States" Then
Row.ErrorColumn = 68 ' ID of CountryRegionName column
Row.ErrorMessage = "Address is not in North America."
Row.DirectRowToMyErrorOutput()
Else
Row.DirectRowToOutput0()
End If
End Sub
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
if (Row.CountryRegionName!="Canada"&&Row.CountryRegionName!="United States")
{
Row.ErrorColumn = 68; // ID of CountryRegionName column
Row.ErrorMessage = "Address is not in North America.";
Row.DirectRowToMyErrorOutput();
}
else
{
Row.DirectRowToOutput0();
}
}
|
См. также