Инструкция―Как отличить ситуацию 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объекты содержали очень подробную информацию - включая код ошибки, сообщение и так далее.Используя эту информацию, вы должны быть в состоянии легко отличить ошибки, основанные на соединении, или ошибки, которые вы поднимаете сами.