小编典典

WHERE子句中'?)AND(Date =?)'附近的语法错误

sql

我正在尝试将SQL准备好的语句发送到MySQL DB。这就是我所拥有的:

    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");                                                   
     }

搜寻了这个问题之后,我找到了在问号或整个where子句周围使用括号的解决方案,例如:

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

不过这没有用。我收到由原始代码生成的相同错误消息:

“您的SQL语法有误;请查看与您的MySQL服务器版本相对应的手册,以找到在第1行附近使用’?)AND(Date =?)’的正确语法。

当我尝试在MySQL Workbench中使用SQL语句时,效果很好。有没有办法在JDBC中使用2
where子句?我知道在其他帖子中人们已经回答过,必须将其作为两个不同的查询发送,但是我想我想问的是,以防其他人阅读此帖子并知道某种方式。谢谢!


阅读 152

收藏
2021-04-15

共1个答案

小编典典

该行(除了 bgpDate所提到的问题外)是以下行: __

ResultSet rs1 = pstmt1.executeQuery(sql1);

您正在尝试在准备好的语句上执行查询字符串,这是JDBC标准所不允许的(MySQL应该实际上抛出一个异常,而不是像当前那样将其发送到服务器,但是最终结果是相同的)。的文档Statement.executeQuery(String sql)说:

抛出: -如果发生数据库访问错误,则在
closeSQLException上调用此方法Statement,给定的SQL语句产生除单个ResultSet对象以外的任何东西,
该方法在PreparedStatement或上调用CallableStatement

(强调我的)

原因是您要执行准备好的语句,而不要执行其他任何查询。您应该调用PreparedStatement.executeQuery()(因此不带参数):

ResultSet rs1 = pstmt1.executeQuery();
2021-04-15