Asp.net RaiseError没有充分引发错误?

Asp.net RaiseError没有充分引发错误?,asp.net,sql-server,tsql,ado.net,Asp.net,Sql Server,Tsql,Ado.net,为什么错误不会出现在UI层?我正在使用ExecuteScaler BEGIN CATCH PRINT N'The transaction is in an uncommittable state. Rolling back transaction.' ROLLBACK TRANSACTION; DECLARE @ErrorMessage NVARCHAR(4000); DECLARE @ErrorSeverity INT; DECLARE @ErrorState INT;

为什么错误不会出现在UI层?我正在使用ExecuteScaler

BEGIN CATCH

  PRINT N'The transaction is in an uncommittable state. Rolling back transaction.'
  ROLLBACK TRANSACTION;

  DECLARE @ErrorMessage NVARCHAR(4000);
  DECLARE @ErrorSeverity INT;
  DECLARE @ErrorState INT;

  SELECT @ErrorMessage = ERROR_MESSAGE(),
         @ErrorSeverity = ERROR_SEVERITY(),
         @ErrorState = ERROR_STATE();

  RAISERROR (@ErrorMessage, 
             @ErrorSeverity,
             @ErrorState);

END CATCH

谢谢

您只能引发用户消息,系统消息只能由引擎引发:

用户定义错误的错误号 消息应大于50000。 如果未指定msg_id, RAISERROR引发一条错误消息 错误号为50000

因此,您无法生成原始的
@ErrorMessage
,必须生成新的错误代码


此外,您的catch块在中是不正确的,因为它假定一个不可提交的事务。情况并非总是如此,在决定交易是否注定失败之前,您必须检查的结果。在许多情况下,错误处理可以继续事务。请参阅。

您只能引发用户消息,系统消息只能由引擎引发:

用户定义错误的错误号 消息应大于50000。 如果未指定msg_id, RAISERROR引发一条错误消息 错误号为50000

因此,您无法生成原始的
@ErrorMessage
,必须生成新的错误代码


此外,您的catch块在中是不正确的,因为它假定一个不可提交的事务。情况并非总是如此,在决定交易是否注定失败之前,您必须检查的结果。在许多情况下,错误处理可以继续事务。请参阅。

首先,查看Remus关于嵌套事务中的错误处理的文章,这样您就了解了所有内容

然后,尝试强制将错误级别设置为16。此外,在重新显示错误时,请将原始错误信息嵌入错误消息中,以免丢失该信息:

BEGIN TRY
  SELECT 1/0
END TRY

BEGIN CATCH

  DECLARE 
    @ErrorMessage  NVARCHAR(4000)
  , @ErrorNumber   INT
  , @ErrorSeverity INT
  , @ErrorState    INT
  , @ErrorLine     INT

  SELECT 
    @ErrorNumber   = ERROR_NUMBER()
  , @ErrorSeverity = ERROR_SEVERITY()
  , @ErrorState    = ERROR_STATE()
  , @ErrorLine     = ERROR_LINE();

  SET @ErrorMessage 
    = '>> Msg %i, Level %i, State %i, Line %i'
    + CHAR(13)+CHAR(10)+ERROR_MESSAGE()

  RAISERROR (
    @ErrorMessage,16,1
  , @ErrorNumber
  , @ErrorSeverity
  , @ErrorState
  , @ErrorLine
  )

END CATCH

首先,回顾Remus关于嵌套事务中的错误处理的文章,这样您就了解了所有内容

然后,尝试强制将错误级别设置为16。此外,在重新显示错误时,请将原始错误信息嵌入错误消息中,以免丢失该信息:

BEGIN TRY
  SELECT 1/0
END TRY

BEGIN CATCH

  DECLARE 
    @ErrorMessage  NVARCHAR(4000)
  , @ErrorNumber   INT
  , @ErrorSeverity INT
  , @ErrorState    INT
  , @ErrorLine     INT

  SELECT 
    @ErrorNumber   = ERROR_NUMBER()
  , @ErrorSeverity = ERROR_SEVERITY()
  , @ErrorState    = ERROR_STATE()
  , @ErrorLine     = ERROR_LINE();

  SET @ErrorMessage 
    = '>> Msg %i, Level %i, State %i, Line %i'
    + CHAR(13)+CHAR(10)+ERROR_MESSAGE()

  RAISERROR (
    @ErrorMessage,16,1
  , @ErrorNumber
  , @ErrorSeverity
  , @ErrorState
  , @ErrorLine
  )

END CATCH

@ONG Ponies:在这个页面上看起来与您发布链接的链接完全相同:(除了回滚之外)回滚事务是否重置了错误?我不明白RAISERROR(@ErrorMessage,@ErrorSeverity,@ErrorState)是怎么回事;如果级别为16且无任何遗憾,则它会引发错误。您是如何捕捉到它的?@Costa,
RAISERROR(@ErrorMessage,@ErrorSeverity,@ErrorState)
不会将错误级别提升到16,无论发生什么,它将其提升到
@ErrorSeverity
@ONG-Ponies:在这个页面上看起来与您将链接发布到的链接相同:(除了回滚)回滚事务是否重置了错误?我不明白RAISERROR(@ErrorMessage,@ErrorSeverity,@ErrorState)是怎么回事;如果级别为16且无任何遗憾,则它会引发错误。您是如何捕捉到它的?@Costa,
RAISERROR(@ErrorMessage,@ErrorSeverity,@ErrorState)
不会将错误级别提升到16,无论发生什么,它将其提升到
@ErrorSeverity
。回滚可提交事务是否有问题?@Costa:提交或回滚可提交事务完全取决于业务逻辑。但是在任何情况下,如果事务不是处于不可提交状态,至少不要打印它。回滚可提交事务是否有问题?@Costa:提交或回滚可提交事务完全取决于业务逻辑。但是在任何情况下,如果事务不是处于不可提交状态,至少不要打印