Блок try / catch в SQL 2005 никогда не достигает «ловить» тесты фиктивных данных despte - PullRequest
1 голос
/ 09 февраля 2010

ОК, у меня нет опыта работы с ошибками SQL 2005, и я научиться обходить операторы try / catch.

Я написал описанную ниже процедуру, но независимо от того, что я ей передам, в моей таблице ErrorLog никогда нет данных. Я прошел все INT значения, все значения даты и времени или строки данных, которых нет в БД и получить «0 строк произведено», но в ErrorLog ничего не сообщается. это как будто утверждение CATCH никогда не достигается (для чего это стоит, я также пытался закомментировать валидацию вверху).

Есть идеи, что я делаю не так? Спасибо.

ALTER PROCEDURE [dbo].[aspnet_Membership_UpdateLastActivityDate]   

@UserId nvarchar(256),
@UserName nvarchar(256),
@LastActivityDate datetime,
@ApplicationName nvarchar(256)

AS

DECLARE @Today DATETIME
DECLARE @MSG VARCHAR(255)
DECLARE @Severity INT
DECLARE @ErrorCode INT

BEGIN

SET XACT_ABORT ON   -- (I have also tried it without XACT_ABORT. No difference)

BEGIN TRY

    SET @ErrorCode = 0
    SELECT @Today = GetDate()

    IF (@UserId IS NULL)
    RETURN(1)

    IF (@UserName IS NULL)
    RETURN(1)

    IF (@LastActivityDate IS NULL)
    RETURN(1)

    BEGIN TRAN
        UPDATE dbo.aspnet_Users WITH (ROWLOCK)
        SET LastActivityDate = @LastActivityDate
        FROM dbo.aspnet_Users u
        INNER JOIN dbo.aspnet_Applications a
        ON u.ApplicationId = a.ApplicationId
        WHERE u.UserName = @UserName
        AND u.UserId = @UserId
        AND a.ApplicationName = @ApplicationName
    COMMIT TRAN

END TRY
BEGIN CATCH

    IF @@TRANCOUNT > 0
        ROLLBACK TRAN   

    SET @ErrorCode = Error_Number()
    SET @Severity = Error_Severity()
    SET @MSG = 'An error was thrown: '
        + 'Error(' + @ErrorCode + '):' + ERROR_MESSAGE()
        + ' Severity = ' + ERROR_SEVERITY() 
        + ' State = ' + ERROR_STATE()
        + ' Procedure = ' + ERROR_PROCEDURE()
        + ' Line Number = ' + ERROR_LINE()

    INSERT INTO [dbo].[ErrorLog]([errornum], [errortype], [errormsg],[errorsource], [errordate])
    VALUES (@ErrorCode, 'E', @MSG, Error_Procedure(), @Today)

    RAISERROR(@MSG, @Severity, 2)

END CATCH

END

RETURN @ErrorCode

Ответы [ 2 ]

2 голосов
/ 09 февраля 2010

Договорились с @Mark.Попробуйте изменить это:

IF (@UserId IS NULL)
    RETURN(1)

На это:

IF (@UserId IS NULL)
BEGIN
    RAISERROR('No UserID was passed in.', 11, 1);
    RETURN 1;
END

Также смотрите эту статью для фантастического учебника по обработке ошибок Эрланда Соммарскога:

http://www.sommarskog.se/error_handling_2005.html

2 голосов
/ 09 февраля 2010

Прошло много времени с тех пор, как я много сделал с обработкой ошибок SQL, но я не вижу места, которое может вызвать ошибку. Вы ожидаете, что заявления «возврата» будут «пойманы»? Этого не произойдет ... они просто вернутся из функции. Вам нужно поднять ошибку, а не вызывать возврат.

...