Syntax error in WHERE clause near '?) AND (Date = ?)'

不想你离开。 提交于 2019-12-02 17:45:46

问题


I am trying to send a SQL prepared statement to MySQL DB. This is what I have:

    String sql1 = "SELECT idReimbursed_Funds As idReimFunds FROM reimbursedfunds Where ReimFundsName = ? AND Date = ?";
    PreparedStatement pstmt1 = conn.prepareStatement(sql1);
    pstmt1.setString(1, reimfund.getReimFundsName());
    pstmt1.setDate(2, (Date) reimfund.getDate());
    ResultSet rs1 = pstmt1.executeQuery(sql1);
    while(rs1.next()){                            
         idReimFunds = rs1.getInt("idReimFunds");                                                   
     }

After googling this problem, I found solutions to use parenthesis around the question marks or the whole where clause such as:

    String sql1 = "SELECT idReimbursed_Funds As idReimFunds FROM reimbursedfunds Where (ReimFundsName = ?) AND (Date = ?)";

This didn't work though. I get the same error message that is generated by my original code:

"You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?) AND (Date = ?)' at line 1.

When I try the SQL statement in MySQL Workbench is works fine. Is there a way to use 2 where clauses with JDBC? I know in other posts people have answered that it has to be sent as two different queries, but I thought I would ask just in case someone else reads this posts and knows of a way. Thank you!


回答1:


The problem (apart from the Date issue as mentioned by bgp), is the line:

ResultSet rs1 = pstmt1.executeQuery(sql1);

You are trying to execute a query string on a prepared statement, which is not allowed by the JDBC standard (MySQL should actually throw an exception instead of sending it to the server as it currently does, but the end result is the same). The documentation of Statement.executeQuery(String sql) says:

Throws:
   SQLException - if a database access error occurs, this method is called on a closed Statement, the given SQL statement produces anything other than a single ResultSet object, the method is called on a PreparedStatement or CallableStatement

(emphasis mine)

The reason is that you want to execute the prepared statement, not any other query. You should call PreparedStatement.executeQuery() (so without a parameter):

ResultSet rs1 = pstmt1.executeQuery();



回答2:


Pretty sure this is because "Date" is a MySQL keyword (reserved). Call the field something else or escape it with backticks, i.e. `Date`



来源:https://stackoverflow.com/questions/18285444/syntax-error-in-where-clause-near-and-date

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!