2009-06-18 17 views
5

Tengo un procedimiento almacenado en un servidor SQL Server 2005 base de datos que tiene una sentencia como esta:SQL Server RAISERROR no causar excepción en cliente .NET

IF @Condition = 0 
    BEGIN 
     RAISERROR('some error message',16,1) 
     RETURN 
    END 

y se llama desde un # C del cliente, así:

try 
      { 
       SomeVariable = SqlHelper.ExecuteScalar(GetConnectionString(), "MySP", new object[] { param1, param2}); 
      } 
      catch (SqlException e) 
      { 
       Console.WriteLine(e.Message); 
      } 

Sin embargo, no hay excepciones. La condición en el SP siempre es verdadera para las pruebas. Para verificar esto, copié la llamada de SQL Server Profiler y la ejecuté en una ventana de consulta y se imprimió ErrorMessage, lo que significa que se produjo el error.

No estoy seguro de lo que está sucediendo.

+0

¿Ha intentado poner un punto de interrupción en su declaración catch, para ver si incluso se está ejecutando? –

+0

Sí. Así es como descubrí que no está funcionando. – Abdu

Respuesta

6

Fui a través de la clase SQL Helper y descubrí que ExecuteScalar come la excepción y devuelve null. Cambié a ExecuteDataSet que no hace esto. Esperaba que el método Execute .. diferente se comportara de la misma manera. La otra forma es usar ExecuteScalar y cuando el SP detecta un error, SELECCIONA un número de error que puede ser manejado en el cliente.

0

¿Tiene algo que ver con el nivel de gravedad? Si aumenta la severidad a 19, ¿eleva la excepción a su código?

+1

niveles de gravedad superiores a 11 es un error que puede ser manejado por el cliente. – Abdu

2

De acuerdo con la gravedad en línea de SQL Books de 16 "Indica errores generales que el usuario puede corregir". - para que la gravedad esté bien.

Solo tengo SQL 2008 para trabajar, pero he probado el RAISERROR ('algunos mensajes de error', 16,1) y el error fue capturado en mi aplicación C#. ¿Estás seguro de que el error no se está manejando en tu clase "SqlHelper"?

+0

Gracias. Leí tu comentario después de hacer mi análisis, que tenía la misma conclusión. – Abdu

1

de los libros en línea

Especificar una gravedad de 10 o inferior para utilizar RAISERROR para devolver un mensaje de un bloque TRY sin invocar el bloque CATCH.

Cuestiones relacionadas