• 使用TRY CATCH进行SQL Server异常处理


    TRY...CATCH是Sql Server 2005/2008令人印象深刻的新特性.提高了开发人员异常处理能力.没有理由不尝试一下Try.. Catch功能.

    * TRY 块 - 包含可能产生异常的代码或脚本
    * CATCH 块 - 如果TRY块出现异常,代码处理流将被路由到CATCH块.在这里你可以处理异常,记录日志等.
    Sql Server中的Try Catch和C#,JAVA等语言的处理方式一脉相承.这种一致性才是最大的创新之处.

    SQL SERVER 2000中异常处理:

    1. CREATE PROC usp_AccountTransaction
    2. @AccountNum INT,
    3. @Amount DECIMAL
    4. AS
    5. BEGIN
    6. BEGIN TRANSACTION --beginning a transaction..
    7. UPDATE MyChecking SET Amount = Amount - @Amount
    8. WHERE AccountNum = @AccountNum
    9. IF @@ERROR != 0 --check @@ERROR variable after each DML statements..
    10. BEGIN
    11. ROLLBACK TRANSACTION --RollBack Transaction if Error..
    12. RETURN
    13. END
    14. ELSE
    15. BEGIN
    16. UPDATE MySavings SET Amount = Amount + @Amount
    17. WHERE AccountNum = @AccountNum
    18. IF @@ERROR != 0 --check @@ERROR variable after each DML statements..
    19. BEGIN
    20. ROLLBACK TRANSACTION --RollBack Transaction if Error..
    21. RETURN
    22. END
    23. ELSE
    24. BEGIN
    25. COMMIT TRANSACTION --finally, Commit the transaction if Success..
    26. RETURN
    27. END
    28. END
    29. END
    30. GO

    上面是Sql server 2000的一个存储过程,在每个数据库操作之后立即必须检查@@ERROR,进行Commit / RollBack该事务.
    Sql server 2000中监测错误,只能通过监测全局遍历 @@ERROR.由于@@ERROR会被下一个数据库操作所覆盖. 所以在每次操作完后必须立即监测.

    SQL SERVER 2005中异常处理:

    TRY...CATCH是SQL Server 2005提供的更具有可读性的语法.每个开发人员都熟悉这种写法.SQL Server 2005仍然支持@@ERROR这种用法.

    1.try catch语法:

    1. BEGIN TRY
    2. Try Statement 1
    3. Try Statement 2
    4. ...
    5. Try Statement M
    6. END TRY
    7. BEGIN CATCH
    8. Catch Statement 1
    9. Catch Statement 2
    10. ...
    11. Catch Statement N
    12. END CATCH

    2.获得错误信息的函数表:

    下面系统函数在CATCH块有效.可以用来得到更多的错误信息:

    函数 描述
    ERROR_NUMBER() 返回导致运行 CATCH 块的错误消息的错误号。
    ERROR_SEVERITY() 返回导致 CATCH 块运行的错误消息的严重级别
    ERROR_STATE() 返回导致 CATCH 块运行的错误消息的状态号
    ERROR_PROCEDURE() 返回出现错误的存储过程名称
    ERROR_LINE() 返回发生错误的行号
    ERROR_MESSAGE() 返回导致 CATCH 块运行的错误消息的完整文本


    简单示例:

    1. BEGIN TRY
    2. SELECT GETDATE()
    3. SELECT 1/0--Evergreen divide by zero example!
    4. END TRY
    5. BEGIN CATCH
    6. SELECT 'There was an error! ' + ERROR_MESSAGE()
    7. RETURN
    8. END CATCH;

    3.try catch回滚/提交事务的示例

    1. ALTER PROC usp_AccountTransaction
    2. @AccountNum INT,
    3. @Amount DECIMAL
    4. AS
    5. BEGIN
    6. BEGIN TRY --Start the Try Block..
    7. BEGIN TRANSACTION -- Start the transaction..
    8. UPDATE MyChecking SET Amount = Amount - @Amount
    9. WHERE AccountNum = @AccountNum
    10. UPDATE MySavings SET Amount = Amount + @Amount
    11. WHERE AccountNum = @AccountNum
    12. COMMIT TRAN -- Transaction Success!
    13. END TRY
    14. BEGIN CATCH
    15. IF @@TRANCOUNT > 0
    16. ROLLBACK TRAN --RollBack in case of Error
    17. -- you can Raise ERROR with RAISEERROR() Statement including the details of the exception
    18. RAISERROR(ERROR_MESSAGE(), ERROR_SEVERITY(), 1)
    19. END CATCH
    20. END
    21. GO 
    转载:http://www.it118.org/Specials/c9fba99e-4401-49cf-8256-ac3c1a34c0d9/4444b6c8-6dae-4c65-8d6d-beb334aee3e3.htm
  • 相关阅读:
    FreeSql.Repository (九)级联保存
    FreeSql.Repository (八)级联加载
    FreeSql.Repository (七)多表查询
    FreeSql.Repository (六)导航属性
    FreeSql.Repository (五)状态管理
    FreeSql.Repository (四)工作单元
    FreeSql.Repository (三)实体特性
    FreeSql.Repository (一)什么是仓储
    [开源] .Net 使用 ORM 访问 华为GaussDB数据库
    24位PCM采样数据转成16位算法,已实现PCM转WAV在线工具源码支持24bits、16bits、8bits
  • 原文地址:https://www.cnblogs.com/guanjie20/p/2024925.html
Copyright © 2020-2023  润新知