2009-06-18 7 views
5

ho una stored procedure in un database SQL Server 2005 che dispone di una dichiarazione come questa:SQL Server Raiserror non causano un'eccezione nel client .NET

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

e si chiama da un client C# in questo modo:

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

Tuttavia non viene sollevata alcuna eccezione. La condizione nell'SP è sempre vera per i test. Per verificare ciò, ho copiato la chiamata da SQL Server Profiler e l'ho eseguita in una finestra di query e l'ErrorMessage è stato stampato, il che significa che l'errore è stato generato.

Non so cosa sta succedendo.

+0

Hai provato a inserire un punto di interruzione nella tua dichiarazione di cattura, per vedere se è addirittura stato eseguito? –

+0

Sì. È così che ho scoperto che non funziona. I livelli di gravità – Abdu

risposta

6

Sono passato attraverso la classe SQL Helper e ho scoperto che ExecuteScalar mangia l'eccezione e restituisce null. Sono passato a ExecuteDataSet che non lo fa. Mi aspettavo che il diverso metodo Execute .. si comportasse nello stesso modo. L'altro modo è usare ExecuteScalar e quando l'SP rileva un errore, fa un SELECT un numero di errore che può essere gestito nel client.

0

È qualcosa a che fare con il livello di gravità? Se aumenti la severità a 19, si solleva l'eccezione attraverso il tuo codice?

+1

superiori a 11 sono un errore che può essere gestito dal client. – Abdu

2

In base alla severità in linea di SQL Books di 16 "Indica errori generali che possono essere corretti dall'utente." - così che la gravità è OK.

Ho solo SQL 2008 con cui lavorare, ma ho provato RAISERROR ('qualche messaggio di errore', 16,1) e l'errore è stato rilevato nella mia app C#. Sei sicuro che l'errore non venga gestito nella tua classe "SqlHelper"?

+0

Grazie. Ho letto il tuo commento dopo che ho fatto la mia analisi che ha avuto la stessa conclusione. – Abdu

1

dai libri on-line

Specificare un livello di gravità di 10 o inferiore per utilizzare RAISERROR per restituire un messaggio da un blocco TRY senza invocando il blocco CATCH.

Problemi correlati