代码之家  ›  专栏  ›  技术社区  ›  Andy Johnson

如何获取ODBC驱动程序尝试执行的原始查询?

  •  2
  • Andy Johnson  · 技术社区  · 17 年前

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

    有时查询会失败,我需要记录失败的上下文。我正在调用sqlError()以获取错误信息,但我还想记录ODBC驱动程序尝试运行的原始查询,即参数值已展开的查询。有没有人能建议是否有办法接触到它?

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

    3 回复  |  直到 17 年前
        1
  •  0
  •   Paul-Jan    17 年前

    据我所知,这不是ODBC的工作原理:参数根本不会“扩展”,而是单独发送到服务器。

    对于您的日志记录情况,只需将参数转换为特殊字符串,并在将其写入日志文件之前将其插入语句文本中。这就是我们在框架中实现它的方式,而且它工作得很好。对于某些参数类型,您必须决定是支持人类可读的日志记录,还是将粘贴复制到SQL Server中进行复制。

        2
  •  1
  •   SqlACID    17 年前

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

        3
  •  0
  •   Kristen    17 年前

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

    我们的应用程序调用存储过程(有点不同),我们记录所有存储过程调用,以及发送的参数;然后用存储过程的返回值更新日志(这样我们就可以报告没有返回结果的日志条目,其中存在某种灾难性故障)。

    然后,我们可以使用给定的参数重新运行任何失败的存储过程,以查看得到的结果。

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

    BEGIN TRANSACTION
    
    EXEC MySproc @FOO='BAR', ...
    
    ROLLBACK
    

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