2013-05-04 167 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