سؤال

لديّ إجراء مخزن يعطي خطأً وديًا بما فيه الكفاية الذي أريد إظهاره للمستخدمين ، لكن عندما أسميه من .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*/);

نصائح أخرى

مباشرة بعد النشر ، قمت بحذف بيان الطباعة واتضح أن عبارات الطباعة يتم تمريرها كجزء من رسالة الاستثناء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top