无法使用驱动程序获取查询字符串

Posted

技术标签:

【中文标题】无法使用驱动程序获取查询字符串【英文标题】:Unable to get string of query using driverspy 【发布时间】:2018-12-03 08:20:09 【问题描述】:

我正在做一个项目,我需要在日志文件中记录查询并将这些查询也添加到我的断言语句中

我已经使用以下驱动程序构建了准备好的语句

net.sf.log4jdbc.sql.jdbcapi.DriverSpy

还有网址

jdbc:log4jdbc:sybase:Tds ........ 

我使用的依赖如下:

    <dependency>
        <groupId>net.sourceforge.jtds</groupId>
        <artifactId>jtds</artifactId>
        <version>1.3.1</version>
    </dependency>

PrepareStatement 示例:

public void getTest(MyBean bean) 
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try 
            conn = DatabaseUtil.getDatabaseConnection();
            ps = conn.prepareStatement(objTestQueryUtil.getQuery("GET_Test"));
            ps.setString(1, bean.getTypeOfTest());
            ps.setString(2, bean.getTest());
            ps.setString(3, bean.getTestState());
            ps.setString(4, bean.getTestStep());
            rs = ps.executeQuery();
            while(rs.next()) 
                bean.setTest(rs.getInt("Test"));
            
        catch (SQLException e) 
            AutomationLog.error(e.getMessage(),e);
        finally 
            DatabaseUtil.close(conn,ps,rs);
        
    

在我的断言类中,sql 应该在我的断言代码中看到:

Assert.assertTrue("Got Test "+query, true);

您能否告诉我是否有任何方法可以在 java 中获取变量中的查询,目前查询直接登录到日志文件中,但无论如何我都无法找到可以在我的脚本中获取它们的方法,即存储在任何变量等上

如果当前依赖项没有针对预先准备好的语句的此类规定,也欢迎使用其他依赖项或解决方案

【问题讨论】:

【参考方案1】:

这不是最佳解决方案,但可以解决您的问题:

打开你的jtds jar文件(或者下载jtds源文件并在你的IDE中导入),找到并反编译类net.sf.log4jdbc.StatementSpy.class,

在该类中添加一个静态 String 变量,我们称之为 myLastExecutedSQL 编辑 reportSQL() 方法,将 sql 方法参数分配给您的静态变量 编译新类(或重新生成 jar)并在您的项目中使用它 在您的测试类中,您将能够使用 StatementSpy.myLastExecutedSQL 访问最后执行的查询

当您使用 maven 时,您必须替换 maven 主文件夹中的 jar

这样做的缺点是您不能在多线程环境中使用它,但它可以解决问题。

我希望它足够清楚

【讨论】:

非常感谢 Deadspock ......我明天肯定会试试这个......你我正在使用 maven ..我可以覆盖那个类还是它是一个密封类......如果我可以覆盖它以某种方式然后我想它会成功 你可以在jar上覆盖它,通常我下载源代码,做调整,编译然后,我只是替换jar上的class文件就可以了。 这是否意味着没有规定我可以在不触及 jar 本身的情况下覆盖源代码中的 lib 函数... 在这种情况下,我认为您不能覆盖它,该特定方法受到保护,如果您能够,父类上的方法将是另一个内部调用的方法类,是写log查询的通用方法,需要修改jar,不好意思 感谢 DeadSpock 的意见......现在投票支持你

以上是关于无法使用驱动程序获取查询字符串的主要内容,如果未能解决你的问题,请参考以下文章

无法使用锚定查询获取重量样本

我无法从Silverlight业务应用程序中的代码中获取查询结果

express 无法从 url 获取查询参数 [重复]

为啥我无法在猫鼬查询中获取字符串的值?

无法保存 MySQL 查询 [重复]

Cakephp无法从URL获取查询字符串