2015-08-28 3 views
1

Я пытаюсь выполнить подготовленный оператор в JDBC, и каждый раз, когда я его выполняю, я получаю сообщение об ошибке «Paramater not set». Я неоднократно пытался проверять наличие неустановленных параметров - но у меня есть только один. Это заставляет меня думать, что это еще одна глупая ошибка с моей стороны.Ошибка параметра не задана в подготовленном заявлении

Если вы могли бы указать на это мне, я был бы очень благодарен

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; 


    } 
+0

Unrelated но: лучше использовать метод 'setXXX()', который соответствует фактическому типу данных. 'setObject()' может работать не так, как ожидалось. Поэтому в вашем случае используйте 'setString (1, key)', который будет намного более надежным. –

ответ

3

Вы звоните prepareStatement дважды, установив параметр на первый, но затем вызывая executeQuery на секунду.

Это не ясно, где вы событие объявляя statement или resultSet, но вы хотите:

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

Обратите внимание, что я сделал resultSet локальной переменной - вы действительно не хотите, чтобы это было поле ... также нет причин для вашей переменной temp, поскольку вы можете просто вернуться непосредственно из цикла while. (Я изменил код, чтобы использовать setString вместо setObject, тоже ...)

Вы должны использовать примерочный с-ресурсы заявления, чтобы закрыть как оператор и результирующий набор автоматически ...)

+0

Святое дерьмо, не могу поверить, что я пропустил это! Спасибо – Goharij

+0

Если вы возвращаетесь непосредственно из цикла while, необходимо использовать try-with-resources, чтобы закрыть «Statement» и «Connection» надлежащим образом после выхода из метода. –

Смежные вопросы