Инструкция―Как отличить ситуацию sqlexception?


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

1) ошибки с самим соединением, или с неисправность или типа-несоответствие параметров; и

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

2 ответа:

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

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

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

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

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