【问题标题】:How to get stack trace for exception occurring in SQL CLR assembly如何获取 SQL CLR 程序集中发生的异常的堆栈跟踪
【发布时间】:2012-08-22 14:27:31
【问题描述】:

我正在尝试使用 SQL CLR 程序集,但它会导致一些异常。但是,SQL Server Management Studio 只说:

Msg 10329, Level 16, State 49, Line 7
.Net Framework execution was aborted. 
The statement has been terminated.

有没有办法获取堆栈跟踪?

【问题讨论】:

  • @MitchWheat - 我不允许发布它。但我不明白这有什么关系。我只是询问如何获取与 SQL CLR 程序集中发生的任何异常相关的堆栈跟踪。
  • 相关。因为这里的敏锐眼睛很可能会在没有堆栈跟踪的情况下发现编码错误......
  • SQL Server 错误日志应该包含更详细的错误。
  • 在 CLR 代码中使用try ... catch
  • @MitchWheat - 我相信“教人钓鱼……”:-)

标签: c# .net sql-server sqlclr clrstoredprocedure


【解决方案1】:

您将无法在 T-SQL 中检索 CLR 堆栈。您有两种途径可供选择:

  1. 修改 CLR 代码,在 CLR 代码中添加try ... catch ...,并使用SqlPipe.Send 将堆栈跟踪到 catch 块的输出。这将在您的 T-SQL 环境中将堆栈打印为信息消息,您可以使用SqlConnection.InfoMessage在客户端捕获它

  2. 将调试器附加到 SQL Server 并捕获第一次机会 CLR 异常(即引发异常时)。这将允许您解决问题并修复它,但显然不是生产的解决方案。 SQL Server 在调试器下停止时将冻结,因此请确保在受控环境中执行此操作。

【讨论】:

    【解决方案2】:

    直接从 SSMS 调用 CLR 应该返回异常和堆栈跟踪,但如果它是从存储过程中调用的,则不会返回错误消息。在这种情况下,您应该使用TRY CATCH 来捕获异常。

    BEGIN TRY
        EXEC myproc     
    END TRY
    BEGIN CATCH
        -- insert the error message into a log table here
        SELECT ERROR_MESSAGE(); 
    END CATCH
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 2011-06-01
      • 1970-01-01
      • 2011-07-03
      • 2017-04-15
      • 2011-01-05
      • 2010-12-20
      相关资源
      最近更新 更多