Инструкция―Как отличить ситуацию sqlexception?
У меня есть около 3-4 хранимых процедур, которые я могу изменить, если это необходимо, которые используют RAISERROR
для информирования моего приложения о некоторых фатальных ошибках на стороне базы данных. Некоторые из этих хранимых процедур выполняются со стороны C# с помощью ExecuteNonQuery
, в то время как другие выполняются с помощью ExecuteReader
. На данный момент я упаковываю эти команды в блок try { ... } catch (SqlException ThisSqlException) { ... }
, но проблема в том, что это исключение будет выброшено по крайней мере в двух сценариях, с которыми я должен иметь дело отдельно:
1) ошибки с самим соединением, или с неисправность или типа-несоответствие параметров; и
2) ошибки, которые возникают всякий раз, когда я используюRAISERROR
явно.
Поскольку это приложение WCF, я должен вернуть клиентскому приложению другую обратную связь, основанную на характере исключения (было ли это вызвано командой RAISERROR
или нет). Как же тогда я могу различать обе ситуации?2 ответа:
RAISERROR
Команда содержит параметр msg_id, который можно использовать для идентификации типа ошибки. Это значение передается приложению черезSqlException.Number
собственность. Таким образом, можно определить любое исключение, вызванное хранимой процедурой, включающей пользовательское сообщение об ошибке, определенное в системе.Если
RAISERROR
вызывается с сообщением об ошибке текстовой строки, тоNumber
будет равно 50000.
Когда вы ловите
SqlException
, вы можете проверить его коллекцииErrors
, которые содержат подробные сообщения об ошибках.Те
SqlError
объекты содержали очень подробную информацию - включая код ошибки, сообщение и так далее.Используя эту информацию, вы должны быть в состоянии легко отличить ошибки, основанные на соединении, или ошибки, которые вы поднимаете сами.