Java运行报java.sql.SQLException: No value specified for parameter 1错误求解
错误原因
- 参数赋值顺序错误:你的SQL语句中
SoCanCuoc = ?有1个占位符参数,但你在调用stmt.executeQuery()执行查询前没有给这个占位符赋值,反而在执行查询后、遍历结果集的代码里才尝试给stmt设置参数,这是触发No value specified for parameter 1报错的直接原因。 - SQL语法错误:查询语句的关键字是
SELECT不是Find,写Find From会直接触发SQL语法错误,即便参数赋值正确也无法运行。 - 逻辑完全混乱:
- 遍历
ResultSet时是从结果集对象rs中读取查询返回的数据,不是给PreparedStatement对象stmt设置参数,你写的stmt.setString(2, congdan.getHoTen())这类代码完全用反了对象。 - 在
while循环里直接调用stmt.close()关闭了语句对象,后续还调用stmt.executeUpdate()执行操作,必然会抛出资源已关闭的错误。 - 你执行的是查询操作,不该调用
executeUpdate()(该方法仅用于INSERT/UPDATE/DELETE等写操作),也不需要通过executeUpdate()的返回值判断是否存在记录。
- 遍历
修复方案
如果你的方法需求是判断传入的身份证号socancuoc对应的公民记录是否存在,修复后的代码示例如下:
public boolean findCongDan(String socancuoc) throws SQLException { boolean isExist = false; openDatabase(); // 修正SQL语法,用COUNT(*)统计符合条件的记录数,判断存在更高效 String sqlFind = "SELECT COUNT(*) as cnt FROM CongDan WHERE SoCanCuoc = ?"; // 用try-with-resources自动释放资源,无需手动关闭 try (PreparedStatement stmt = jdbcConnection.prepareStatement(sqlFind)) { // 先给占位符赋值,再执行查询 stmt.setString(1, socancuoc); try (ResultSet rs = stmt.executeQuery()) { if (rs.next()) { // 统计数大于0说明记录存在 isExist = rs.getInt("cnt") > 0; } } } finally { closeDatabase(); } return isExist; }
如果你需要同时获取公民数据封装到CongDan对象返回,可以调整成如下逻辑:
public CongDan findCongDan(String socancuoc) throws SQLException { CongDan congdan = null; openDatabase(); String sqlFind = "SELECT HoTen, DiaChi, GioiTinh, NgaySinh, DanToc, TonGiao FROM CongDan WHERE SoCanCuoc = ?"; try (PreparedStatement stmt = jdbcConnection.prepareStatement(sqlFind)) { stmt.setString(1, socancuoc); try (ResultSet rs = stmt.executeQuery()) { if (rs.next()) { congdan = new CongDan(); // 从ResultSet中读取数据赋值给对象 congdan.setHoTen(rs.getString("HoTen")); congdan.setDiaChi(rs.getString("DiaChi")); congdan.setGioiTinh(rs.getString("GioiTinh")); congdan.setNgaySinh(rs.getString("NgaySinh")); congdan.setDanToc(rs.getString("DanToc")); congdan.setTonGiao(rs.getString("TonGiao")); } } } finally { closeDatabase(); } return congdan; // 不存在则返回null,可根据业务需求调整返回逻辑 }
内容的提问来源于stack exchange,提问作者Nguyễn Tiến Đạt
相关产品推荐
相关产品推荐

