2011-06-28 20 views
9

Mam około 3-4 procedur przechowywanych - które można modyfikować w razie potrzeby - które używają RAISERROR do informowania mojej aplikacji o pewnych krytycznych błędach po stronie bazy danych. Niektóre z tych procedur przechowywanych są wykonywane ze strony C# z ExecuteNonQuery, a inne są wykonywane z ExecuteReader. W tej chwili zawijam te polecenia w bloku try { ... } catch (SqlException ThisSqlException) { ... }, ale problem polega na tym, że ten wyjątek zostanie zgłoszony w co najmniej dwóch scenariuszach, z którymi osobno muszę się uporać:RAISERROR - Jak odróżnić od SqlException?

1) Błędy związane z samym połączeniem lub z błędem lub niedopasowane parametry; i

2) Błędy występujące zawsze, gdy jednoznacznie używam RAISERROR.

Ponieważ jest to aplikacja WCF, muszę zwrócić do aplikacji klienckiej różne opinie w zależności od charakteru wyjątku (niezależnie od tego, czy było to spowodowane komendą RAISERROR, czy nie). Jak zatem rozróżnić obie sytuacje?

Odpowiedz

12

Parametr msg_id zawiera 01g, który może służyć do identyfikacji typu błędu. Ta wartość jest dostarczana do aplikacji za pośrednictwem właściwości SqlException.Number. W ten sposób można zidentyfikować każdy wyjątek wywołany przez procedurę przechowywaną, która zawiera niestandardowy komunikat o błędzie zdefiniowany w systemie.

Jeśli RAISERROR nazywa się z komunikatem o błędzie łańcuch tekstowy, a następnie Number będzie 50000.

+0

+1. Myślę, że w taki sposób zamierzam go użyć. – User

+1

można określić niestandardowy numer dla msg_id w celu rozpoznania własnych określonych błędów, ale numer musi zostać najpierw zarejestrowany w tabeli sys.messages bazy danych i musi być> 50000. Patrz http://msdn.microsoft.com/en -us/library/ms178592.aspx – stombeur

4

Po złapaniu numeru SqlException można przejrzeć jego kolekcje Errors zawierające szczegółowe komunikaty o błędach.

Te obiekty SqlError zawierały bardzo szczegółowe informacje - w tym kod błędu, komunikat i tak dalej.

Używając tych informacji, powinieneś być w stanie łatwo odróżnić błędy związane z połączeniem lub błędy, które sam popełniłeś.

+0

+1. Dziękuję bardzo. – User

Powiązane problemy