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
المحلول
يرجى التعليق على "printRorString ؛" بيان. عندما يلقي محرك SQL خطأ ، فإنه يعرض جميع الرسائل متوفرة في مكدس الرسائل.
سبب:
حاول تشغيل كود SNAP أدناه.
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*/);
نصائح أخرى
مباشرة بعد النشر ، قمت بحذف بيان الطباعة واتضح أن عبارات الطباعة يتم تمريرها كجزء من رسالة الاستثناء.