2012-12-08 4 views
0

대부분의 코드가 작동하는 것처럼 보입니다. 그러나 스레드 "main"의 예외가 계속 발생합니다 java.sql.SQLException : 매개 변수 인덱스가 범위를 벗어났습니다. 매개 변수는 0입니다. readDatabase()의 finally 블록 이후에 발생합니다. 그것은 print 서술문 System.out.println에 도달하지 않는다 ("여기에 오지 않는다"); 이유를 모르겠습니다. 모든 것이 처리되는 클래스가 있습니다. 메인 클래스에서이 클래스의 객체를 만들고 readDatabase()를 호출합니다.매개 변수 인덱스가 범위를 벗어남 finally 블록의 마지막 부분에있는 mysql

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

당신은 콘솔에'Writing meta data'를 받고 계셨습니까? 나는 위의 줄에 의해 던져진 예외 때문에 그것이 오지 않았을 것이라고 믿는다. 마지막으로'System.exit()'가 없으면 항상 실행됩니다. – Vikdor

관련 문제