我正在尝试向MySQL DB发送SQL预处理语句。这就是我所拥有的:
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行附近使用正确的语法??”(Date =?)'。
当我在MySQL Workbench中尝试SQL语句时工作正常。有没有办法在JDBC中使用2 where子句?我知道在其他帖子中人们已经回答它必须作为两个不同的查询发送,但我想我会问以防万一其他人阅读这些帖子并知道一种方法。谢谢!
答案 0 :(得分:2)
很确定这是因为“Date”是一个MySQL关键字(保留)。将字段称为其他内容或使用反引号将其转义,即`Date`
答案 1 :(得分:2)
问题(除了 bgp 提到的Date
问题)之外,还有一行:
ResultSet rs1 = pstmt1.executeQuery(sql1);
您正在尝试在预准备语句上执行查询字符串,这是JDBC标准不允许的(MySQL应该实际抛出异常而不是像现在一样将其发送到服务器,但最终结果是相同的)。 Statement.executeQuery(String sql)
的文档说:
<强>抛出:强>
上调用
SQLException
- 如果发生数据库访问错误,则在关闭的Statement
上调用此方法,给定的SQL语句生成除单个ResultSet
对象以外的任何内容, 方法在PreparedStatement
或CallableStatement
(强调我的)
原因是您要执行预准备语句,而不是任何其他查询。你应该拨打PreparedStatement.executeQuery()
(所以没有参数):
ResultSet rs1 = pstmt1.executeQuery();