RAISERROR ― Как отличить SqlException? - PullRequest
9 голосов
/ 28 июня 2011

У меня есть около 3-4 хранимых процедур - которые я могу изменить при необходимости - которые используют RAISERROR, чтобы сообщить моему приложению о некоторых фатальных ошибках на стороне базы данных. Некоторые из этих хранимых процедур выполняются со стороны C # с помощью ExecuteNonQuery, а другие - с ExecuteReader. В данный момент я обертываю эти команды в блок try { ... } catch (SqlException ThisSqlException) { ... }, но проблема в том, что это исключение будет выдано как минимум в двух сценариях, с которыми мне придется иметь дело отдельно:

1) Ошибки с самим соединением или с ошибочными или несоответствующими параметрами; и

2) Ошибки, возникающие при явном использовании RAISERROR.

Поскольку это приложение WCF, я должен вернуть клиентскому приложению различную обратную связь, основанную на характере исключения (независимо от того, была ли это команда RAISERROR или нет). Как тогда я могу различить обе ситуации?

Ответы [ 2 ]

14 голосов
/ 28 июня 2011

Команда RAISERROR включает параметр msg_id, который можно использовать для определения типа ошибки. Это значение передается приложению через свойство SqlException.Number. Таким образом, вы можете идентифицировать любое исключение, вызванное хранимой процедурой, которая включает в себя пользовательское сообщение об ошибке, определенное в системе.

Если RAISERROR вызывается с сообщением об ошибке текстовой строки, то Number будет 50000.

4 голосов
/ 28 июня 2011

Когда вы ловите SqlException, вы можете проверить его Errors коллекций, которые содержат подробные сообщения об ошибках.

Эти SqlError объекты содержали очень подробную информацию - включая код ошибки, сообщение и т. Д.

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

...