SqlServerを呼び出したときに複製されたsqlexception.messageが格納されました
-
02-10-2019 - |
質問
ユーザーに表示したいほどの友好的なエラーを提供するストアドプロシージャがありますが、.NETからそれを呼び出すと、2回出てきます。 SQL Server Management StudioからPROCを呼び出すと、一度だけ出てきます。
これは、保存されたProcの切り抜きバージョンです:
ALTER PROC [Production].[spDoSomething] (
@PassedID int)
AS
BEGIN
DECLARE @ErrorString nvarchar(500);
BEGIN TRY
...
RAISERROR('Bad things are happening.', 11 /*severity*/, 1 /*state*/);
...
END TRY
BEGIN CATCH
SET @ErrorString = 'Error found:' + ERROR_MESSAGE();
PRINT @ErrorString;
RAISERROR(@ErrorString, 11 /*severity*/, 1 /*state*/);
END CATCH
END
これをいくつかのC#コードで使用して呼びます ExecuteNonQuery()
の System.Data.SqlClient.SQLCommand
オブジェクト、それから私はaをキャッチします System.Data.SqlClient.SQLException
しかし、メッセージには含まれています
「エラー:悪いことが起こっているのが発見されています。
誰かがそれが二度出てくる理由を知っていますか?
これは、SQL Server 2008および.NET 3.5にあります
解決
「print @errorstring;」にコメントしてください声明。 SQLエンジンがエラーをスローすると、すべてのメッセージがメッセージスタックで使用可能になります。
理由:
コードスナップ以下を実行してみてください。
CREATE PROCEDURE ErrorHandler
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @ErrorString nvarchar(500);
BEGIN TRY
RAISERROR('Bad things are happening.', 11 /*severity*/, 1 /*state*/);
END TRY
BEGIN CATCH
SET @ErrorString = 'Error found:' + ERROR_MESSAGE();
PRINT @ErrorString;
PRINT 'Stack overflow'
RAISERROR(@ErrorString, 11 /*severity*/, 1 /*state*/);
END CATCH
END
GO
EXEC ErrorHandler
SQLエンジンは3つのメッセージを生成します。
1. 1st for PRINT @ErrorString;
2. 2nd for PRINT 'Stack overflow'
3. 3rd for RAISERROR(@ErrorString, 11 /*severity*/, 1 /*state*/);
他のヒント
投稿後すぐに印刷ステートメントを削除し、例外メッセージの一部として印刷ステートメントが通過することがわかりました。
所属していません StackOverflow