Как получить данные, когда есть обработанные ошибки - PullRequest
1 голос
/ 16 января 2012

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

Моя проблема заключается в том, что при вызове этой процедуры перечисления в программе на C # и однойиз процедур обработки завершается неудачно, сообщение об ошибке проходит, и я не могу получить доступ к набору записей, содержащему список идентификаторов счетов и флагов ошибок.Процедура работает в Management Studio: ошибка отображается на вкладке сообщений, но вкладка результатов также показывает возвращенный список счетов.Но в коде метод DataAdapter.Fill () дает сбой и все.Как я могу получить список счетов в этом случае?Или я могу как-то очистить сообщение об ошибке?

ПРИМЕЧАНИЕ: оно должно работать в SQL 2000 и 2008.

1 Ответ

0 голосов
/ 16 января 2012

Я считаю, что это самый важный момент, который вы должны иметь в виду: Ваша процедура не должна возвращать ошибку при возникновении ошибки при обработке счета-фактуры: поскольку счет-фактура является элементом деловой программы в вашей программе, это следует рассматривать как «ожидаемую» или «поддающуюся объяснению» ошибку, которая должна корректно обрабатываться. Другими словами, вы должны использовать возвращаемые параметры, в этом случае, чтобы вернуть номер ошибки и, возможно, описание ошибки обратно вызывающей стороне, в то же время позволяя вам получить набор результатов. Или, что еще лучше, наличия «неудачного счета-фактуры» в наборе результатов должно быть достаточно для вызывающего метода, чтобы определить, что что-то пошло не так ... Чтобы ответить на ваш вопрос, да, я считаю, что DataAdapter сбрасывает поток результатов, как только обнаруживает ошибку (хотя и не уверен!) .... Я также полагаю, что у вас будет такая же проблема с вызовом, использующим команду ADO и соединение ....

Просто всегда имейте это в виду: если вы можете предсказать, что ошибка МОЖЕТ произойти в процедуре (более влажный SQL или на любом языке программирования), вы не должны допускать возникновения ошибки, но обрабатывайте ее там и используйте возвращаемые параметры для сообщить вызывающему методу, что что-то пошло не так.

Так что я бы переписал ваш SQL-процесс: 1) Сохраните ваш набор результатов в табличной переменной 2) поймать ошибку 3) сохранить информацию об ошибке в возвращаемых параметрах 4) откатить проц 5) Сгенерировать набор результатов из таблицы переменных

После этого вы сможете получить сообщение об ошибке и # из ваших выходных параметров, PLUS получить ваш набор результатов. Но опять же, набор результатов, содержащий ошибки, должен быть достаточным для того, чтобы вызывающий метод обнаружил, что произошла ошибка «ОЖИДАЕМЫЕ» ....

Я знаю, что это не идеальное или законченное решение, но как общая идея, оно должно работать!

...