2

ストアド プロシージャ:

Procedure GetLocalConfig
(
    @ConfigId int
)
AS
SET NOCOUNT ON; 
BEGIN TRY
BEGIN TRANSACTION
SELECT 1/0
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    SELECT 
    ERROR_NUMBER() AS ErrorNumber
    ,ERROR_SEVERITY() AS ErrorSeverity
    ,ERROR_STATE() AS ErrorState
    ,ERROR_PROCEDURE() AS ErrorProcedure
    ,ERROR_LINE() AS ErrorLine
    ,ERROR_MESSAGE() AS ErrorMessage;  


     IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION;
        RETURN 
END CATCH

ストアド プロシージャを呼び出す .Net コード:

try
{
return DatabaseFactory.CreateDatabase(ConnectionStringConfigName)
       .ExecuteSprocAccessor(DbCommands.GetLocalConfig, new LocalConfigDtoMapper(), configId)
       .Single();

}
catch (Exception ex)
{
   // Exception : Sequence contains no elements???
}

SSMS からこの SP を実行すると、実際の例外が発生します。

ErrorNumber ErrorSeverity ErrorState  ErrorProcedure ErrorLine   ErrorMessage
8134        16            1           GetLocalConfig 54           Divide by zero error encountered.

.Net の try catch ブロックでこの例外を確認したいのですが、Sequence には要素が含まれていません。

いくつかの調査の後、ストアドプロシージャ内で RAISEERROR を実行できることがわかりました。キャッチブロックを試してください:

DECLARE @errnum nchar(5), @errmsg nvarchar(2048);
SELECT
   @errnum = RIGHT('00000' + ERROR_NUMBER(), 5),
   @errmsg = @errnum + ' ' + ERROR_MESSAGE();
RAISERROR (@errmsg, 16, 1);

SSMS を使用して SP を実行すると、次のようになります。

メッセージ 50000、レベル 16、状態 1、プロシージャ GetLocalConfig、行 70
8134 ゼロ除算エラーが発生しました。

しかし、それでも .Net から同じ例外が発生します。この場合、例外を .Net に渡すにはどうすればよいですか?

4

2 に答える 2

1

SPから返されたエラー行がGetLocalConfigを使用してマップされていないと思いLocalConfigDtoMapperます。別のスキーマが必要です。

したがって、実際の例外を抑制し、間違ったスキーマの行を返します。これにより、長さゼロのシーケンスまたは空の列挙型が呼び出し元に返されます。Single()チェックで行が 1 つしかないことが確認されると、何もないため、適切な例外がスローされます。


エラー時にロールバックしたい場合は、これらの重複を見てください

文字列データが切り捨てられたときにTSQLでトランザクションをロールバックする方法は?

SQL Server 2008 トランザクション、ロールバックが必要ですか?

SQL Server - トランザクションはエラー時にロールバックしますか?

本質的に

RAISERRORブロック内でエラーを再発生させることができますCATCHERROR_... 関数を使用して、元の「例外」の詳細を取得できます

また

SET XACT_ABORT ON

于 2013-01-28T17:19:11.440 に答える
0

SP 内の TRY CATCH ブロックは、実際のエラー メッセージを抑制し、アプリケーションで実際の例外が発生することを削除していました。

于 2013-01-28T17:21:47.460 に答える