2015-05-11 3 views
0

Я писал код Java для аутентификации и обновления учетных данных для моего инструмента отчетности о доходах.java: resultSet error

getName() - это функция для запроса имени пользователя, а затем перекрестная проверка моей базы данных на любые повторяющиеся записи и, соответственно, добавление.

Моя проблема в том, что когда я предоставляю другое имя при запуске, он работает и добавляет имя в базу данных. Но когда я обеспечиваю дубликат имя, а затем указать другое имя он дает мне эту ошибку:

Exception in thread "main" java.sql.SQLException: Operation not allowed after ResultSet closed 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920) 
    at com.mysql.jdbc.ResultSetImpl.checkClosed(ResultSetImpl.java:804) 
    at com.mysql.jdbc.ResultSetImpl.next(ResultSetImpl.java:6986) 
    at database_console1.test2.getName(test2.java:67) 
    at database_console1.test2.getName(test2.java:74) 
    at database_console1.test2.getName(test2.java:74) 
    at database_console1.test2.getName(test2.java:74) 
    at database_console1.test2.getName(test2.java:74) 
    at database_console1.test2.getName(test2.java:74) 
    at database_console1.test2.main(test2.java:44) 
Java Result: 1 
BUILD SUCCESSFUL (total time: 20 seconds) 

Вот моя функция.

public void getName() throws SQLException {   
    String sqla = "SELECT * FROM veuser where UserName = ?" ; 
    String sql = "INSERT INTO veuser (UserName) VALUES (?)"; 
    boolean b = true; 
    while (b) { 
     System.out.println("Enter your username"); 
     name = sc.nextLine(); 
     if (!"".equals(name)) { 
      b = false; 
     } else { 
      System.out.println("Username cant be left blank"); 
     } 
    } 


    ps = conn.prepareStatement(sqla); 
    ps.setString(1, name); 
    rs = ps.executeQuery(); 
    while (rs.next()) { 

      String i = rs.getString(2); 
      System.out.println(i); 

      if (i.equals(name)) { 
       System.out.println("User already exists.Choose another username"); 
       getName(); 

      } 
      } 

       os = conn.prepareStatement(sql); 
       os.setString(1, name); 
       int row = os.executeUpdate(); 
       if (row > 0){ 
        System.out.println("Successfully added..."); 
      ps.close(); 
      os.close();    
    } 

ответ

3

Ваш код является рекурсивным. Вы вызываете функцию getName() из себя, но после ее возвращения первый вызов продолжает выполнение.

Для примера скажем, у вас есть имя пользователя Джон и вы достигаете этой линии:

if (i.equals(name)) { 
      System.out.println("User already exists.Choose another username"); 
      getName(); 

     } 

Имя пользователя, Джон уже существует, и вы называете GetName() еще раз. Вы назначили имя во втором вызове правильному. Затем во втором вызове вы вставляете строку и возвращаетесь к первому вызову, где он пытается вставить то же имя снова. Если вы попробуете с 3-4 разными именами, и все провалится, он попытается сделать 3-4 вставки в конце.

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

0

Проблема заключается в том, что вы не можете выполнять обновления над Statement, если вы уже используете тот же самый оператор, в вашем случае, итерации на нем.

Прочитано post