2011-06-28 19 views
9

Tengo unos 3-4 procedimientos almacenados, que puedo modificar si es necesario, que usan RAISERROR para informar a mi aplicación de algunos errores fatales en el lado de la base de datos. Algunos de estos procedimientos almacenados se ejecutan desde el lado C# con ExecuteNonQuery, mientras que otros se ejecutan con ExecuteReader. Por el momento, estoy envolviendo estos comandos en un bloque try { ... } catch (SqlException ThisSqlException) { ... }, pero el problema es que esta excepción se lanzará en al menos dos escenarios que debo tratar por separado:RAISERROR-¿Cómo distinguir con SqlException?

1) Errores con la conexión en sí, o con fallas o parámetros de tipo no coincidente; y

2) Errores que ocurren cada vez que uso RAISERROR explícitamente.

Dado que se trata de una aplicación WCF, debo devolver a la aplicación cliente diferentes comentarios en función de la naturaleza de la excepción (ya sea debido a un comando RAISERROR o no). ¿Cómo puedo, entonces, distinguir entre ambas situaciones?

Respuesta

12

El RAISERROR command incluye un parámetro msg_id, que se puede utilizar para identificar el tipo de error. Este valor se suministra a la aplicación a través de la propiedad SqlException.Number. De esta forma, puede identificar cualquier excepción planteada por un procedimiento almacenado que incluya un mensaje de error personalizado que esté definido en el sistema.

Si RAISERROR se llama con un mensaje de error cadena de texto, a continuación, Number habrá 50000.

+0

+1. Creo que esa es la forma en que voy a usar. – User

+1

puede especificar un número personalizado para que msg_id reconozca sus propios errores específicos, pero el número debe registrarse primero en la tabla sys.messages de la base de datos y debe ser> 50000. Consulte http://msdn.microsoft.com/en -us/library/ms178592.aspx – stombeur

4

Cuando detecta SqlException, puede inspeccionar sus colecciones Errors que contienen los mensajes de error detallados.

Los objetos SqlError contenían información muy detallada, incluyendo código de error, mensaje, etc.

Usando esa información, debería ser capaz de distinguir fácilmente entre errores basados ​​en la conexión o errores que usted mismo plantea.

+0

1. Muchas gracias. – User

Cuestiones relacionadas