Bạn sẽ gặp lỗi này khi gọi bất kỳ setXxx()
nào các phương thức trên PreparedStatement
, trong khi chuỗi truy vấn SQL không có bất kỳ trình giữ chỗ nào ?
cho điều này.
Ví dụ:đây là sai :
String sql = "INSERT INTO tablename (col1, col2, col3) VALUES (val1, val2, val3)";
// ...
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, val1); // Fail.
preparedStatement.setString(2, val2);
preparedStatement.setString(3, val3);
Bạn cần sửa chuỗi truy vấn SQL cho phù hợp để chỉ định trình giữ chỗ.
String sql = "INSERT INTO tablename (col1, col2, col3) VALUES (?, ?, ?)";
// ...
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, val1);
preparedStatement.setString(2, val2);
preparedStatement.setString(3, val3);
Lưu ý rằng chỉ mục tham số bắt đầu bằng 1
và bạn không cần phải trích dẫn những trình giữ chỗ như vậy:
String sql = "INSERT INTO tablename (col1, col2, col3) VALUES ('?', '?', '?')";
Nếu không, bạn sẽ vẫn nhận được cùng một ngoại lệ, vì trình phân tích cú pháp SQL sau đó sẽ diễn giải chúng dưới dạng giá trị chuỗi thực và do đó không thể tìm thấy trình giữ chỗ nữa.