2013-05-04 204 views
1

我用「的ADOConnection」連接到SQL Server,並在ADOQuery使用下面的代碼:「AdoConnection.Errors [0:顯示錯誤消息

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

當我通過調用錯誤信息] .NativeError「 它始終返回」5000「

當我通過:」AdoConnection.Errors [0] .Number「 調用錯誤消息它返回一個負數!

如何從SQL SERVER獲得正確的錯誤號?

回答

2

MSSQL的所有錯誤都會有ERROR_NUMBER 50000.您可以使用sp_addmessage註冊自己的消息,但使用它們很笨拙。

MSSQL 2012有新的關鍵字THROW,這正是你想要的。

你可以做2008年那麼,假設你從失敗中CATCH塊恢復:

  1. 您可以構建自己的錯誤消息,這將是Exception.Message
  2. ERROR_NUMBER不值錢
  3. ERROR_SEVERITY嚴重程度是出於不同的目的
  4. 嘿,有ERROR_STATE,您可以使用:)
  5. 對於存儲過程,你可以使用合格的返回值或輸出參數有關成功或失敗的信息
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 [email protected] 
    -- 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 
+0

感謝您的解決方案。但是我需要在Delphi中得到一個錯誤號。還有其他解決方案嗎? – 2013-05-05 03:55:52

+0

它在示例代碼中。您可以使用RETURN值或OUTPUT參數 - 存儲過程。或者你可以「構建你自己的真棒」ErrorMessage並在裏面添加ErrorNumber。 – DiGi 2013-05-05 08:27:17