【问题标题】:Using variables to create SQL statements使用变量创建 SQL 语句
【发布时间】:2015-07-10 10:46:12
【问题描述】:

我正在尝试制作一个使用用户输入数据为表构建自定义查询的 sql 查询构建器类型程序

到目前为止我有

public int checkBetweenDates() throws SQLException{
        String t1 = "2015-07-08"; //or later some user input variable
        String t2 = "2015-07-09";//or later some user input variable
        String id = "22 03 E7 99";//or later some user input variable
        int rowCount = -1;
        //Statement stmt = null;        

        String dateChoice = "select count(*) " 
                + "from dancers " 
                + "where ts between (t1) and (t2)"
                + "and id = (id)"
                + "values (?)";

        Connection conn = DriverManager.getConnection(host, username, password);
        System.out.println("Connected:");
         PreparedStatement preparedStmt = (PreparedStatement) conn.prepareStatement(dateChoice);
         preparedStmt.setString    (1, t1);
//       preparedStmt.setString    (2, t2);
//       preparedStmt.setString    (3, id);
        // stmt = conn.createStatement();
        ResultSet rs = preparedStmt.executeQuery(dateChoice); 
        try {
                rs = preparedStmt.executeQuery(dateChoice);
                rs.next();
                rowCount = rs.getInt(1);
                System.out.println(rowCount);
            }
         catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally {
            rs.close();
            preparedStmt.close();
        }
        return rowCount; 

    }

所以它连接并且一切正常,但它没有执行查询,说明值的 sql 语法有问题(?,?,?)

任何帮助都会很棒谢谢大家!!

卡尔

【问题讨论】:

  • sql server 和 mysql 存在语法差异。您将使用您的工具针对哪一个?此外,哪个服务器给了您上述错误? mysql还是sql server?
  • 从 where 子句中删除 + "values (?)"
  • 就像@Mini 指出的那样,SQL 不正确。我看到两个问题 1. t1 和 t2 是字符串,但您的代码没有连接它并直接使用。 2. values() 是用于插入而不是用于选择。建议在通过 JDBC 执行之前在 SQL 提示符下运行它。另一方面,在当今世界,JPA(带有 EclipseLink/Hibernate)为静态和动态查询提供了非常好的支持。我的两分钱是看那些而不是试图想出你自己的。

标签: java mysql sql sql-server jdbc


【解决方案1】:

试试这个,更改查询和设置准备好的语句参数,

public int checkBetweenDates() throws SQLException{
        String t1 = "2015-07-08"; //or later some user input variable
        String t2 = "2015-07-09";//or later some user input variable
        String id = "22 03 E7 99";//or later some user input variable
        int rowCount = -1;
        //Statement stmt = null;        

        String dateChoice = "select count(*) " 
                + "from dancers " 
                + "where ts between ? and ?"
                + "AND id = ?";

        Connection conn = DriverManager.getConnection(host, username, password);
        System.out.println("Connected:");
         PreparedStatement preparedStmt = (PreparedStatement) conn.prepareStatement(dateChoice);
       preparedStmt.setString    (1, t1);
       preparedStmt.setString    (2, t2);
       preparedStmt.setString    (3, id);
        // stmt = conn.createStatement();
        ResultSet rs = preparedStmt.executeQuery(dateChoice); 
        try {
                rs = preparedStmt.executeQuery(dateChoice);
                rs.next();
                rowCount = rs.getInt(1);
                System.out.println(rowCount);
            }
         catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally {
            rs.close();
            preparedStmt.close();
        }
        return rowCount; 

    }

如果对您不起作用,请分享确切的错误。

【讨论】:

    【解决方案2】:

    改变这个:

    String dateChoice = "select count(*) " 
                + "from dancers " 
                + "where ts between (t1) and (t2)"
                + "and id = (id)"
                + "values (?)";
    

    根据您使用的数据库语法。例如,如果您使用带有 Mysql 的网络服务器,请输入查询以查看拼写错误的位置。 (如果您使用 mysql,则每个表都需要dancers

    【讨论】:

      【解决方案3】:

      首先,您似乎已经多次编辑此方法以尝试修复问题,这使其处于混乱状态。

      把sql语句中的“values(?)”去掉,不属于这里,好像是准备好的insert语句遗留下来的。

      使用零参数调用preparedStmt.executeQuery(),你已经为它提供了sql字符串并且只调用一次,你给rs赋值了两次。

      你的sql语句应该正好包含三个问号,试试

      select count(*) from dancers where ts between ? and ? and id = ?
      

      接下来调用preparedStmt.setString() 3 次以提供值t1、t2 和id。

      另外,记得在 finally 块中关闭连接对象。

      【讨论】:

        猜你喜欢
        • 2013-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-11
        • 1970-01-01
        • 2011-04-05
        • 2020-08-02
        • 2019-04-27
        相关资源
        最近更新 更多