2012-12-08 53 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