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 に答える