ОК, у меня нет опыта работы с ошибками 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