2016-11-16 9 views
3

は、ここで「uspTest」SQL ServerのRAISERRORからC#でエラーをキャッチする方法はありますか?

BEGIN TRY 
SELECT 3/0; 
END TRY 

BEGIN CATCH 
RAISERROR('D', 16, 3); 
END CATCH 

と呼ばれる私のストアドプロシージャのコードであり、ここで、私はこのコードを実行すると

public IHttpActionResult RegisterUser(RegisterModelView registerViewModel) 
    { 

     try 
     { 
      using (AusHerbEntities ctx = new AusHerbEntities()) 
      { 
       ctx.uspTest(); 
       Console.Write("i am in try block"); 
      } 


     } 

     catch (Exception e) 
     { 
      Console.Write(e.Message); 

     } 
     return Ok(); 
    } 

、C#コードでCatchブロックが呼び出されていないVisual Studioでの私のC#のコードですストアドプロシージャでエラーが発生するため、呼び出されることが期待されます。

このコードはどのように動作させることができますか?

私は、ストアドプロシージャのcatchブロックでRAISERRORを行い、C#コードでエラーをキャッチしたいだけです。

+0

あなたのコードは、あなたが考えるべきことをしているようです。何が起こるかを見るためにブレークポイントを入れましたか? –

+0

私も確認できますが、sqlの構文が正しいと考えています。あなたはこの質問をチェックすることができます私はこれがあなたの問題の場合は気づいていない:http://stackoverflow.com/questions/33502318/sqlexception-not-caught-in-winforms – mybirthname

+0

私はもう一度試みたが、それは動作しません、トレッドストアドプロシージャを実行するために0が期限切れになりました。これは例外がスローされないことを意味しますか? –

答えて

0

SqlExceptionをスローするには、ストアドプロシージャを@@errorに設定して戻す必要があります。あなたの場合、END CATCHステートメントは@@errorをクリアします。 RAISERRORステートメントの直後にRETURNステートメントを挿入すると、SqlExceptionがスローされます。

BEGIN TRY 
SELECT 3/0; 
END TRY 

BEGIN CATCH 
RAISERROR('D', 16, 3); 
RETURN; 
END CATCH 
+0

私は試しましたが残念ですが、catchブロックはまだ呼び出されません。 –

+0

RAISERROR( 'd' 16、3)TRYブロックで、それはうまく動作しますが、私はSELECT 3/0;それは動作しません。それは本当に奇妙な原因3/0も正しいエラーを投げる? –

+0

ここに例外があります。スルーがあります。 RAISERRORでない –

0

SQLでtry-catchが必要ですか?トランザクションをロールバックするためだけに使用している場合は、XACT_ABORTをONに設定してtry-catchを使用しないでください。トランザクションはロールバックされ、エラーはクライアントにバブル処理されます。件名に関する良い記事です:https://www.simple-talk.com/sql/t-sql-programming/defensive-error-handling/

-1

すべてのC#コードを表示することはできません。 catch(例外e) と catch(SqlException e)

+1

例外はSqlExceptionを含むすべての例外をキャッチします – Bestter

+0

'Exception'は' SqlException'の基本クラスです。例外がスローされた場合、 'catch(Exception)'がそれをキャッチします。私のdownvoteではない –

関連する問題