2012-12-08 59 views
0

我的大部分代码似乎都能正常工作,但我一直在线程中得到异常“main”java.sql.SQLException:Parameter index out of range(1> number of参数,它是0)。它发生在readDatabase()中的finally块之后。它没有得到打印语句System.out.println(“不会在这里”); 我不知道为什么。这里是处理所有事情的课程。在主类中,它只是构成这个对象的一个​​对象,并调用readDatabase();参数索引超出范围mysql在finally块的末尾

import java.sql.Connection; 
import java.sql.Date; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 

//static because when creating an object of it in main, you won't have to make an object of the outer class (SQLProject) first 
public class MySQLAccess{ 
    private Connection connect = null; 
    private Statement statement = null; 
    private PreparedStatement preparedStatement = null; 
    private ResultSet resultSet = null; 

    public void readDatabase() throws Exception 
    { 
     try{ 
      Class.forName("com.mysql.jdbc.Driver"); 
      connect = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", ""); 

      statement = connect.createStatement(); 
      System.out.println("here1"); 
      resultSet = statement.executeQuery("select * from test.comments"); 
      writeResultSet(resultSet); 

      preparedStatement = connect.prepareStatement("INSERT INTO test.comments values(default, ?, ?, ?, ?, ?, ?)"); 
      //columsn in test.comments 
      // myuser, email, webpage, datum, summary, COMMENTS 
      preparedStatement.setString(1, "Test"); 
      preparedStatement.setString(2, "TestEmail"); 
      preparedStatement.setString(3, "TestWebpage"); 
      preparedStatement.setDate(4, new java.sql.Date(2009, 12, 11)); 
      preparedStatement.setString(5, "Test Summary"); 
      preparedStatement.setString(6, "Test Comment"); 
      System.out.println("here2"); 
      preparedStatement.executeUpdate(); 

      preparedStatement = connect.prepareStatement("SELECT myuser, webpage, datum, summary, comments FROM test.comments"); 
      System.out.println("here3"); 
      resultSet = preparedStatement.executeQuery(); 
      writeResultSet(resultSet); 

      preparedStatement = connect.prepareStatement("DELETE FROM test.comments WHERE myuser='?';"); 
      preparedStatement.setString(1, "Test"); 
      preparedStatement.executeUpdate(); 

      resultSet = statement.executeQuery("SELECT * FROM test.comments;"); 
      System.out.println("Writing meta data"); 
      writeMetaData(resultSet); 
     } 
     catch (Exception e){ 
      throw e; 
     } 
     finally{ 
      close(); 
      System.out.println("ALMOST"); 
      } 
     System.out.println("DOESN'T GET HERE"); 
    } 

    private void writeMetaData(ResultSet resultSet) throws SQLException 
    { 
     System.out.println("The columns in the table are: "); 
     System.out.println("Table: " + resultSet.getMetaData().getTableName(1)); 

     for(int i=1;i<=resultSet.getMetaData().getColumnCount(); i++) 
     { 
      System.out.println("Column " + i + " " + resultSet.getMetaData().getColumnName(i)); 
     } 
    } 

    private void writeResultSet(ResultSet resultSet) throws SQLException 
    { 
     while(resultSet.next()) 
     { 
      String user = resultSet.getString("myuser"); 
      String website = resultSet.getString("webpage"); 
      String summary = resultSet.getString("summary"); 
      Date date = resultSet.getDate("datum"); 
      String comment = resultSet.getString("comments"); 

      System.out.println("User: " + user); 
      System.out.println("website: " + website); 
      System.out.println("summary: " + summary); 
      System.out.println("date: " + date); 
      System.out.println("comment: " + comment); 
     } 
    } 

    private void close() 
    { 
     try{ 
      if(resultSet != null) 
       resultSet.close(); 
      if(statement != null) 
       statement.close(); 
      if(connect != null) 
       connect.close(); 

     } 
     catch(Exception e){ 
      e.printStackTrace(); 
      System.out.println("hello"); 
      System.out.println(e); 
     } 
    } 
}//private inner class 
+0

给予充分的堆栈跟踪,一些例外执行捕捉 - 最后是抛出异常 – Subin

回答

3
preparedStatement = 
    connect.prepareStatement("DELETE FROM test.comments WHERE myuser='?';"); 
preparedStatement.setString(1, "Test"); 

这是有问题的声明。问号用引号括起来,因此语句解析器无法找到它,所以下一条语句抛出错误。

尽管参数类型是String,但相应的占位符不应包含在引号中。准备好的语句处理器将负责根据参数的数据类型生成适当的SQL。因此,它始终是一个普通的?,应该用作任何数据类型参数的占位符。

因此,这两个语句应该仅仅是如下:

preparedStatement = 
    connect.prepareStatement("DELETE FROM test.comments WHERE myuser=?"); 
preparedStatement.setString(1, "Test"); 
+0

谢谢后扔在try块,所以!有效! – rasen58

+0

但是为什么最后这样做呢? – rasen58

+0

你确定你正在控制台上写入元数据吗?由于上面提到的例外情况,我相信这是不会出现的。至于最后,它会一直执行,除非你有一个'System.exit()'。 – Vikdor