Parameter not set error in Prepared statement

I'm trying to execute a prepared statement in JDBC, and everytime I execute it I get the error message "Paramater not set". I have tried repeatedly to check for unset parameters - but I only have the one. This leads me to believe it is another foolish error on my part.

If you could point this out to me, I would be very grateful

public book search(String key){
        book temp = null;

        try {
            String stmt = "SELECT BookID, Title, Author, Media, Available FROM BOOK WHERE Title LIKE ?;"; 
            connection = DatabaseConnection(); 
            PreparedStatement preparedStmt = connection.prepareStatement(stmt); 
            System.out.println(key);
            preparedStmt.setObject(1, key);//the name
            statement = connection.prepareStatement(stmt); //Using Prepared Statements prepare the query

            resultSet = statement.executeQuery(); //Execute the query



            while (resultSet.next()) {

                int bookID = resultSet.getInt("BookID");//Get the userName
                String title = resultSet.getString("Title"); //Get the score
                String author = resultSet.getString("Author"); //Get the score
                String media = resultSet.getString("Media"); //Get the score
                boolean available = resultSet.getBoolean("Available"); //Get the score

                temp = new book(title,author,media,available,bookID);


            }
            connection.close(); //close connection


        } catch (SQLException e) {
            System.err.println("Got an exception!");
            System.err.println(e.getMessage());
        }



        return temp;


    }
Jon Skeet
people
quotationmark

You're calling prepareStatement twice, setting the parameter on the first one but then calling executeQuery on the second.

It's not clear where you're event declaring statement or resultSet, but you want:

PreparedStatement preparedStmt = connection.prepareStatement(stmt); 
preparedStmt.setString(1, key);
ResultSet resultSet = preparedStmt.executeQuery();

Note that I've made resultSet a local variable - you really don't want it to be a field... there's also no reason for your temp variable as you can just return directly from the while loop. (I've changed the code to use setString instead of setObject, too...)

You should use try-with-resources statements to close both the statement and the result set automatically...)

people

See more on this question at Stackoverflow