Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Пакет SSIS, получение описания ошибки  [new]
topic starter
Member

Откуда:
Сообщений: 245
Добрый день, уважаемые форумчане.

Дано:
Есть пакет, который заливает в БД данные из плоского файла.
При выполнении пакета иногда возникает ошибка, нарушающая уникальность ключа таблицы.
Вывод ошибок перенаправлен в текстовый файл.
Для получения описания ошибки использую скрипт, описанный в этом разделе BOL:

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    Row.ErrorDescription = this.ComponentMetaData.GetErrorDescription(Row.ErrorCode);
}

Столбцы ErrorCode и ErrorDescription из выхода скрипта передаются на вход текстового файла.


Проблема:
После выполнения пакета строка текстового файла выглядит так:

-1073704166,При выполнении команды были выданы ошибки.

То есть видно, что там есть и код (ErrorCode), и описание (ErrorDescription), но оно неинформативное.

А вот если удалить из пакета перенаправление вывода ошибок, то на выводе отладки получаем вот такое симпатичное сообщение:

Ошибка: 0xC0202009 в Обработка csv-файла, Вставка записей в таблицу[327]: 

Код ошибки служб SSIS: DTS_E_OLEDBERROR. Возникла ошибка OLE DB. Код ошибки: 0x80040E14.
Доступна запись OLE DB. Источник: "Microsoft SQL Server Native Client 10.0" Результат: 

0x80040E14 Описание: "Не удается вставить повторяющуюся строку ключа в объект "dbo.TableName" с уникальным индексом "uq_TableName_FieldName". Повторяющееся значение ключа: (12345).".



Вопрос:
Как получить информативное описание ошибки на выходе скрипта?
5 июн 12, 11:23    [12666512]     Ответить | Цитировать Сообщить модератору
 Re: Пакет SSIS, получение описания ошибки  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3754
topic starter,
А у меня тот же Description полученый тем же образом выглядит так - "The data value violates integrity constraints."

В Row.ErrorColumn лежит ID колонки вызвавшей ошибку
5 июн 12, 13:46    [12667897]     Ответить | Цитировать Сообщить модератору
 Re: Пакет SSIS, получение описания ошибки  [new]
topic starter
Member

Откуда:
Сообщений: 245
Ivan Durak,

интересно, может это где-то настраивается?
5 июн 12, 13:57    [12668032]     Ответить | Цитировать Сообщить модератору
 Re: Пакет SSIS, получение описания ошибки  [new]
topic starter
Member

Откуда:
Сообщений: 245
Я имею в виду, может где-нибудь настраивается степень детализации сообщения об ошибке?
Хотя это вряд ли. Наверное, другая причина.
А не может ли такое поведение быть следствием того, что у меня BIDS локализована?..

Хотелось при отладке до столбца ошибочного добраться (который Row.ErrorColumn) и там в рантайме покопаться, но дебаггером не удалось воспользоваться. Я ставлю точку останова в скрипте, но при запуске отладки, не происходит остановки. Почему?
5 июн 12, 14:08    [12668155]     Ответить | Цитировать Сообщить модератору
 Re: Пакет SSIS, получение описания ошибки  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3754
topic starter
Я имею в виду, может где-нибудь настраивается степень детализации сообщения об ошибке?
Хотя это вряд ли. Наверное, другая причина.
А не может ли такое поведение быть следствием того, что у меня BIDS локализована?..

Хотелось при отладке до столбца ошибочного добраться (который Row.ErrorColumn) и там в рантайме покопаться, но дебаггером не удалось воспользоваться. Я ставлю точку останова в скрипте, но при запуске отладки, не происходит остановки. Почему?

локализация только на перевод влияет. Так колумн у вас же есть, выводите и его себе в файл Row.ErrorColumn.ToString()
5 июн 12, 14:42    [12668568]     Ответить | Цитировать Сообщить модератору
 Re: Пакет SSIS, получение описания ошибки  [new]
topic starter
Member

Откуда:
Сообщений: 245
Ivan Durak,
хех, я с этого и начинал :-) Row.ErrorColumn.ToString() выводит в файл ноль. Только нолик и все.
5 июн 12, 15:53    [12669166]     Ответить | Цитировать Сообщить модератору
 Re: Пакет SSIS, получение описания ошибки  [new]
topic starter
Member

Откуда:
Сообщений: 245
Уфф. Фиксед.

Проблема не решилась в таком виде как была поставлена, но нашлось обходное решение. Напишу, может кому пригодится.

Тот компонент OLEDB Command, чей вывод ошибок перенаправляется в текстовый файл, вызывал серверную хранимку. В ней ошибки ловятся в TRY..CATCH, и в кэтче стоит RAISERROR('bla-bla-bla', 16, 1). Так вот если TRY..CATCH убрать, то ErrorCode и соответственно GetErrorDescription начинают возвращать нормальные информативные значения:
-1071607696,Значение типа данных нарушает ограничения целостности для данного столбца.

Могу попытаться предположить, что происходит при перенаправленном выводе ошибок в OLEDB Сommand. Когда этот компонент вызывает ХП, в той срабатывает RAISERROR и генерирует станартный пользовательский код ошибки (50000 если не ошибаюсь). Поэтому, может быть, ErrorCode и устанавливается в неопределенное значение (-1073704166 = DTS E COMMAND DESTINATION ADAPTER STATIC ERRORS IN COMMAND). А без рерайзинга значение ErrorCode ничем не забивается и берется как есть. Но это только мои домыслы.

И странно, почему тот же RAISERROR нисколько не мешает среде BIDS отображать верное сообщение об исключении, когда вывод ошибок OLDEDB Command НЕ перенаправлен. Наверно, используются разные механизмы получения информации об ошибке.

Как бы то ни было, проблема в общем решена. Пришлось пожертвовать трай-кэтчем и рерайзингом, но в моем случае это нестрашно, так как хранимка все равно предназначена только для вызова этим пакетом и больше никем.
6 июн 12, 14:53    [12675038]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить