【问题标题】:How to get raw query that the ODBC driver tries to execute?如何获取 ODBC 驱动程序尝试执行的原始查询?
【发布时间】:2009-02-17 11:45:34
【问题描述】:

我正在使用 C++ 使用 ODBC 查询 SQL Server 2005 数据库。查询包含我使用 SQLSetParam() 设置的参数。我通过调用 SQLExecute() 来运行查询。

有时查询会失败,我需要记录失败的上下文。我正在调用 SQLError() 来获取错误信息,但我还想记录 ODBC 驱动程序尝试运行的原始查询 - 即扩展参数值的查询。任何人都可以建议是否有办法访问这个?

上下文是生产环境中的错误记录。错误发生时我不在“那里”,所以我不能使用分析器或类似工具。这就是为什么我想记录尽可能多的信息以供以后分析。

【问题讨论】:

    标签: sql-server odbc


    【解决方案1】:

    您可以通过控制面板在客户端上启用 ODBC 跟踪,但要为严重的性能损失和要读取的一些非常大的日志文件做好准备。

    【讨论】:

      【解决方案2】:

      没有。据我了解,这不是 ODBC 的工作方式:参数根本不会“扩展”,而是单独发送到服务器。

      对于您的日志记录情况,只需将参数临时转换为字符串并将它们插入语句文本中,然后再将其写入日志文件。这就是我们在框架中的做法,而且效果很好。对于某些参数类型,您必须决定是支持人类可读的日志记录还是复制粘贴到 sql server 中进行复制。

      【讨论】:

        【解决方案3】:

        使用 SQL Profiler 查看实际发送到服务器的内容?

        我们的 APP 调用 Sprocs(有点不同),我们记录所有的 Sproc 调用,以及发送了哪些参数;然后,我们使用 Sproc 的返回值更新日志(因此我们可以报告没有返回结果的日志条目,其中存在某种灾难性故障)

        然后我们可以使用给定的参数重新运行任何失败的 SProcs,看看我们得到了什么结果。

        当我们重新运行它们时,我们用

        包装它们
        BEGIN TRANSACTION
        
        EXEC MySproc @FOO='BAR', ...
        
        ROLLBACK
        

        这样他们就不会对数据库进行任何更改

        【讨论】:

        • 啊,好吧,你说你不想运行 Profiler,抱歉
        猜你喜欢
        • 2016-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-09
        • 2022-08-06
        相关资源
        最近更新 更多