2015-08-28 92 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

无关但是:最好使用与实际数据类型相对应的'setXXX()'方法。 'setObject()'可能不总是按预期工作。所以在你的情况下,使用'setString(1,key)'将会更加可靠。 –

回答

3

你打电话prepareStatement两次,设置在第一个参数,但然后调用第二executeQuery非常感激。

目前尚不清楚,你在哪里事件声明statementresultSet,但你想:

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

请注意,我做了resultSet一个局部变量 - 你真的不希望它是一个场...您也没有理由为您的temp变量,因为您可以直接从while循环返回。 (我已经改变了代码中使用setString代替setObject,太...)

你应该使用try-与资源语句来关闭语句和结果自动设置...)

+0

神圣的废话,不能相信我错过了!谢谢 – Goharij

+0

如果直接从while循环中返回,那么在退出方法时,应该使用try-with-resources来正确关闭'Statement'和'Connection'。 –