0

我正在尝试将 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 子句?我知道在其他帖子中人们已经回答它必须作为两个不同的查询发送,但我想我会问以防万一其他人阅读这篇文章并知道一种方式。谢谢!

4

2 回答 2

2

问题(除了bgpDate提到的问题)是以下行:

ResultSet rs1 = pstmt1.executeQuery(sql1);

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

抛出:
   SQLException - 如果发生数据库访问错误,则在关闭时调用此方法Statement,给定的 SQL 语句生成除单个ResultSet对象之外的任何内容,在上调用该方法PreparedStatementCallableStatement

(强调我的)

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

ResultSet rs1 = pstmt1.executeQuery();
于 2013-08-17T08:45:36.173 回答
2

很确定这是因为“日期”是 MySQL 关键字(保留)。将该字段称为其他名称或使用反引号将其转义,即`Date`

于 2013-08-17T05:27:34.780 回答