2013-03-14 3 views
0

Я работаю над сценарием, где я должен выполнить SQL-запрос в JDBC, чтобы найти информацию о студентах, обучающихся по определенному предмету. Когда этот запрос выполняется, одновременно отображаются три записи. Затем пользователю предлагается либо нажать Enter, чтобы вернуться в главное меню, либо нажать B, чтобы продолжить просмотр результатов или ввести StudentID, чтобы вывести результаты из предыдущих семестров. В моем коде ниже, после отображения 3 результатов, мой код работает правильно, когда пользователь нажимает Enter или B. Однако после ввода StudentID и выполнения суб-запроса код автоматически отображает главное меню. Я бы хотел, чтобы он вернулся и продолжал показывать оставшиеся результаты, как вариант B для просмотра.Невозможно вернуться к результатам запроса SQL JDBC после выполнения подзапроса

Ниже приведен фрагмент кода:

// Below is the SQL query that will be executed 
// This snippet is part of loop where all different subjects are entered into an array and then user selects one subject 
String displayStudent = "select * from students where subject = '" + subjectArray[choice - 1] + "'"; 
ResultSet displayThisList = stmt.executeQuery(displayStudent); 
while (displayThisList.next()) { 
    System.out.println("Fname: " + displayThisList.getString(2)); 
    System.out.println("Lname: " + displayThisList.getString(3)); 
    System.out.println("StudentID: " + displayThisList.getString(1)); 
    System.out.println("Grade: " + displayThisList.getString(4)); 
    System.out.println("Subject: " + displayThisList.getString(5)); 
    System.out.println(); 
    subCount++; 
    if ((subCount % 3 == 0)) { 
     String response = readEntry("Enter StudentID to view last semester results or\nB Enter to browse or \nENTER to go back:"); 
     System.out.println(); 
     if (response.equals("")) { 
      // Back to member menu 
      break; 
     } else if (response.equals("B")) { 
      // Continue to browse 
      continue; 
     } else { 
      // Check if the StudentID is valid or not 
      int checkID = 0; 
      String queryID = "select * from students where StudentID='" + response + "'"; 
      ResultSet setID = stmt.executeQuery(queryID); 
      while (setID.next()) { 
       String FName = setID.getString(2); 
       String LName = setID.getString(3); 
       String Grade = setID.getString(4); 
       String Subject = setID.getString(5); 
       checkID++; 
       System.out.println("Correct ID was entered"); 
       //Code to execute query based on above info from a different table 
      } 
      if (checkID == 0) { 
       System.out.println(); 
       System.out.println("Invalid ID. Please enter again."); 
       System.out.println(); 
      } 
     } 
    } 
} 
+0

исправлена ​​ошибка опечатка – xs2dhillon

+0

Меняются ли вы переменную 'displayThisList' в«Код для выполнения запроса и т.д. ...»? –

+0

Нет, я не хочу. Допустим, что когда пользователь вводит идентификатор студента, он отображает только «Идентификатор правильности», а затем должен вернуться к оставшимся результатам. Я добавил этот оператор печати ниже инструкции: checkID ++ – xs2dhillon

ответ

2

Во-первых, вы не должны использовать один и тот же объект Statement для различных запросов если вы используете соответствующий ResultSet взаимозаменяемые. Создайте один оператор для внешнего запроса и еще один для подзапроса.

Во-вторых, в while -loop (setId.next()), вы, вероятно, читать данные из-за неправильного ResultSet (должны setID.getString(), не setISBN.getString()).

Кроме того, если SQL-запросы генерируются на основе пользовательского ввода, вы определенно должны использовать PreparedStatement. Рассмотрим, что произойдет, когда кто-то входит StudentId как:

'; delete from students; select * from students where StudentID='foobar 
+0

Спасибо за это предложение о создании отдельных операторов и использовании PreparedStatement. Я должен уехать сейчас, но я попробую это вечером и уточню. Благодарю. – xs2dhillon

+0

+1 для SQL-инъекции. –

+0

Подтверждено, что код работает с приведенными выше предложениями. Спасибо за ваши материалы – xs2dhillon

Смежные вопросы