1

我使用“Adoconnection”连接到 SQL Server 并在 ADOQuery 中使用以下代码:

BEGIN TRY
...
END TRY
BEGIN CATCH
  RAISERROR(LTrim(str(ERROR_NUMBER())))
END CATCH

当我通过以下方式调用错误消息时:“AdoConnection.Errors[0].NativeError”它总是返回“5000”

当我通过以下方式调用错误消息时:“AdoConnection.Errors[0].Number”它返回一个负数!

如何从 SQL SERVER 获得正确的错误号?

4

1 回答 1

2

您自己的所有来自 MSSQL 的错误都会有 ERROR_NUMBER 50000。您可以使用sp_addmessage注册自己的消息,但使用它们很笨拙。

MSSQL 2012 有新的关键字THROW,这正是你想要的。

因此,假设您从 CATCH 块中的故障中恢复,您可以在 2008 年做什么:

  1. 您可以构建自己的错误消息,该消息将在 Exception.Message
  2. ERROR_NUMBER 一文不值
  3. ERROR_SEVERITY 严重性用于不同目的
  4. 嘿,有ERROR_STATE,你可以使用它:)
  5. 对于存储过程,您可以使用 RETURN 值或 OUTPUT 参数来传递有关成功或失败的信息
BEGIN TRY

  BEGIN TRAN

  --
  -- some code
  --

  IF @@ROWCOUNT = 0 OR @SomeYourValue <> @SomeOtherValue
    RAISERROR('Your own error message', 16, 1);

  --
  -- some code
  --

  IF @@ROWCOUNT > 10 OR @SomeYourValue = @SomeOtherValue
    RAISERROR('Your own error message', 16, 2);

  COMMIT

END TRY
BEGIN CATCH

  DECLARE
    @ErrorMessage NVARCHAR(2048) = ERROR_MESSAGE(),
    @ErrorNumber INT = ERROR_NUMBER(),
    @ErrorSeverity INT = ERROR_SEVERITY(),
    @ErrorState INT = ERROR_STATE(),
    @ErrorProcedure NVARCHAR(126) = ERROR_PROCEDURE(),
    @ErrorLine INT = ERROR_LINE()

  ROLLBACK

  -- construct your own awesome message
  SET @ErrorMessage =
    LEFT(
        'Error ' + CAST(@ErrorNumber AS VARCHAR(10)) + ': '
        + @ErrorMessage
        + ' Line: ' + CAST(@ErrorLine AS VARCHAR(10))
        + ISNULL(' ' + @ErrorProcedure, ''), 2044)

  -- pass error
  RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState)

  -- or use return value if you want numbers instead Error messages from SQL
  IF @ErrorNumber < 50000
    RETURN @ErrorNumber
  ELSE
    RETURN -@ErrorState
  -- In Delphi: AdoProc.Parameters.ParamByName('@RETURN_VALUE').AsInteger:
  -- 0 = all OK
  -- > 0 - some SQL error number
  -- < 0 - hey, my own errors!

  -- or declare @ErrorMessage, @ErrorNumber and @ErrorState as
  -- procedure's OUTPUT parameters
END CATCH
于 2013-05-04T12:45:15.780 回答