JDBC调用executeQuery执行SET SCHEMA语句出现SQLException如何解决?
错误原因
- 直接触发报错的原因是执行
SET SCHEMA CECS323LAB语句时错误调用了executeQuery()方法:executeQuery()仅适用于执行返回ResultSet结果集的查询语句(通常是SELECT类语句),而SET语句属于DDL操作,不会返回结果集,只会返回操作计数,不符合executeQuery()的调用要求。 - 除此之外代码还存在SQL拼接语法错误:拼接
select OrderDate和from ORDERS时没有加空格,最终生成的SQL会出现OrderDatefrom的错误拼接,修复完第一个问题后也会触发SQL语法报错。
修复方案
- 替换SET SCHEMA语句的执行方法,把
prep.executeQuery()改为prep.execute()或者prep.executeUpdate()均可。 - 修正SQL拼接的空格问题,在
select OrderDate末尾加空格,where PRODUCTNAME = ?末尾也加空格,避免拼接后关键词粘连。 - 可选优化:原代码中CustomerName的模糊匹配值是硬编码写死的
%Euro%,如果需要动态传入可以把这个部分也改成占位符,避免SQL注入风险。
修复后参考代码
PreparedStatement prep = null; try { prep = conn.prepareStatement("SET SCHEMA CECS323LAB"); // 替换为适配非查询语句的execute方法 prep.execute(); // 修正拼接空格问题 String query = "select OrderDate " + "from ORDERS O inner join ORDERDETAILS OD on O.ORDERNUMBER = OD.ORDERNUMBER " + "inner join PRODUCTS P on P.PRODUCTCODE = OD.PRODUCTCODE " + "where PRODUCTNAME = ? " + "and CUSTOMERNUMBER = ( select CUSTOMERNUMBER from CUSTOMERS where CUSTOMERNAME like ? )"; assert conn != null; prep = conn.prepareStatement(query); prep.setString(1, "1957 Chevy Pickup"); // 动态传入客户名的模糊匹配参数 prep.setString(2, "%Euro%"); ResultSet data = prep.executeQuery(); }
内容的提问来源于stack exchange,提问作者Abhay Solanki
相关产品推荐
相关产品推荐

