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;
}
ような何かを試みることができますか –
発信者に例外がスローされないように、SPの内部でTRY/CATCHを使用しないでください。 –
@MichaelMailletあなたの投稿を編集して例外をそこに置きます。 – paqogomez