SQLException.message Дублируется при вызове SQLServer Хранить ProC
-
02-10-2019 - |
Вопрос
У меня есть сохраненная процедура, которая дает достаточно дружескую ошибку, которую я хочу показать пользователям, но когда я называю его от .NET, он выходит дважды. Когда я называю Proc из SQL Server Management Studio, он только один раз.
Вот версия отсекания хранимых работ:
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
объект, то я ловлю System.Data.SqlClient.SQLException
Но сообщение содержит
«Ошибка: обнаружено плохие вещи. Nerror найдено: плохие вещи происходят».
Кто-нибудь знает причину, по которой он выходит дважды?
Это на SQL Server 2008 и .NET 3.5
Решение
Пожалуйста, прокомментируйте «Печать @errorString;» утверждение. Когда SQL Engine бросает ошибку, она отобразится все сообщения доступны в стеке сообщений.
Причина:
Попробуйте запустить подразу ниже кода.
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 Engine генерирует 3 сообщения;
1. 1st for PRINT @ErrorString;
2. 2nd for PRINT 'Stack overflow'
3. 3rd for RAISERROR(@ErrorString, 11 /*severity*/, 1 /*state*/);
Другие советы
Сразу после публикации я удалил оператор печати, и получается, что операторы печати пропускаются как часть сообщения исключения.