2014-01-08 12 views
5

Linq-to-SQL経由でC#で呼び出しているストアドプロシージャがあります。 @@errorの値をチェックするためにストアドプロシージャ内にいくつかのコードがあります。値がゼロでない場合は、カスタムエラーメッセージを返したいと思います。Linq-to-SQL - C#でストアドプロシージャをスローする例外を呼び出す

エラーの処理方法をテストするために、ストアドプロシージャを意図的に妨害しようとしています。

私の例では、5文字しかサポートしない列に6文字の値を挿入しようとしています。その結果、切り捨てエラーが発生します。

ストアドプロシージャは問題をキャッチし、エラーコード/説明をいくつかのOUTPUTパラメータに保存しますが、C#コードではストアドプロシージャを呼び出すと例外が発生するため、値を取得できません私のエラーコード/記述パラメータ。

CREATE TABLE [dbo].[Test](
[itemName] [varchar](5) NOT NULL 
) ON [PRIMARY] 

ここに私のストアドプロシージャのコードがあります:

CREATE PROCEDURE [dbo].[TestSP] 
@itemName VARCHAR(5) 
,@Error BIT OUTPUT 
,@ErrorReason VARCHAR(1000) OUTPUT 
AS 

BEGIN 

SET NOCOUNT ON 

DECLARE @err INT 

BEGIN TRANSACTION 

INSERT INTO [dbo].[Test] 
     ([itemName]) 
VALUES 
     --(@itemName) 
     ('123456') 

SELECT @err = @@error 
IF @err <> 0 
    BEGIN 
     ROLLBACK TRANSACTION 
     SELECT @Error = 1 
     SELECT @ErrorReason = 'Error while inserting row to Test table' 
     RETURN @err 
    END 

--If all 3 table inserts succeed without issue then return 0 
COMMIT TRANSACTION 

END 

最後に、ここに私のC#のコードです、のは、私は次の表を持っているとしましょう、方法を理解するために、最もシンプルな中にこれを説明するために

例外をスローします。

例外は次のとおりです。文字列またはバイナリのデータは切り捨てられます。ステートメントは終了されました。 (System.Data.SqlClient.SqlException)

この例外を発生させる方法はありますか?OUTPUTパラメータを使用できますか?

try 
{ 
    using (DataClasses1DataContext dbContext = new DataClasses1DataContext()) 
    { 
     bool? error = false; 
     string errorText = ""; 

     int result = dbContext.TestSP("test", ref error, ref errorText); 
    } 
} 
catch (Exception ex) 
{ 
    string err = ex.Message; 
    throw; 
} 
+0

ような何かを試みることができますか –

+0

発信者に例外がスローされないように、SPの内部でTRY/CATCHを使用しないでください。 –

+0

@MichaelMailletあなたの投稿を編集して例外をそこに置きます。 – paqogomez

答えて

2

あなたは、ストアドプロシージャの内部であなたのTSQLコードでTRY/CATCHを使用する必要があります。このようにして、実際の例外はDB側で処理され、C#呼び出し側にスローされません。

トランザクションのコミット/ロールバックを含むMSDNリンクの例を参照してください。

1

あなたはTESTSPが投げている例外は何でしょうか。この

BEGIN TRY 
BEGIN TRANSACTION 
    INSERT INTO [dbo].[Test] ([itemName]) VALUES ('123456') 
COMMIT TRANSACTION 
END TRY 
BEGIN CATCH 
    ROLLBACK TRANSACTION 
    SELECT @Error = 1 
    SELECT @ErrorReason = 'Error while inserting row to Test table' 
    RETURN @err 
END CATCH 
+0

TRY/CATCHセクションに追加します。これはトリックを行うようだ。みんな、ありがとう。 –

関連する問題