Я пытаюсь отобразить строгие строки из базы данных в NetBeans, но появляется только одна строка - PullRequest
0 голосов
/ 29 февраля 2020

В настоящее время мне нужно написать код, который при запуске соединяется с базой данных и отображает все оценки ученика после ввода соответствующего SSN. Главное препятствие, с которым я сталкиваюсь, состоит в том, что, как только я вставлю SSN, он принесет только одну оценку, а не все. Что-то не так с моей логи c? Я просто использую неправильные детали, чтобы сделать это? Я пытался поместить более одного lblstatus, но это не сработало. Вот код:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import java.sql.*;

public class Week13 extends Application {

    private TextField tfSSN = new TextField();
    private Label lblStatus = new Label();
    private PreparedStatement preparedStatement;

    @Override 
    public void start(Stage primaryStage) {
        initializeDB();

        Button btShowGrade = new Button("Show Grade");
        HBox hBox = new HBox(5);
        hBox.getChildren().addAll(new Label("SSN"), tfSSN, (btShowGrade));

        VBox vBox = new VBox(10);
        vBox.getChildren().addAll(hBox, lblStatus);

        tfSSN.setPrefColumnCount(6);
        btShowGrade.setOnAction(e -> showGrade());

        Scene scene = new Scene(vBox, 420, 80);
        primaryStage.setTitle("FindGrade"); 
        primaryStage.setScene(scene);  
        primaryStage.show(); 
    }

    private void initializeDB() {
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            System.out.println("Driver loaded");

            Connection connection = DriverManager.getConnection("blank for the purpose of posting this");
            System.out.println("Database connected");
            String queryString = "select firstName, mi, lastName, title, grade " 
                + "from Student, Enrollment, Course where Student.ssn = ? and "
                + "Enrollment.ssn = Student.ssn and Enrollment.courseId = "
                + "Course.courseId";
            preparedStatement = connection.prepareStatement(queryString);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

private void showGrade() { 
      String ssn = tfSSN.getText();

 try {
     preparedStatement.setString(1, ssn);
     ResultSet rset = preparedStatement.executeQuery();

 if (rset.next()) { 
          String lastName = rset.getString(1); 
          String mi = rset.getString(2); 
          String firstName = rset.getString(3); 
          String title = rset.getString(4); 
          String grade = rset.getString(5); 

          lblStatus.setText(firstName + " " + mi + 
 " " + lastName + "'s grade on course " + title + " is " + 
            grade); 
        } else { 
          lblStatus.setText("Not found"); 
        } 
      } 
 catch (SQLException ex) { 
        ex.printStackTrace(); 
      }
}
}

Ответы [ 3 ]

0 голосов
/ 29 февраля 2020

Вы использовали if, который выполняется только один раз, и, следовательно, вы получаете только одну запись.

Замените

if (rset.next()) { 
    String lastName = rset.getString(1); 
    String mi = rset.getString(2); 
    String firstName = rset.getString(3); 
    String title = rset.getString(4); 
    String grade = rset.getString(5); 

    lblStatus.setText(firstName + " " + mi + 
    " " + lastName + "'s grade on course " + title + " is " + 
    grade); 
} else { 
    lblStatus.setText("Not found"); 
} 

на

StringBuilder s = new StringBuilder();
int c = 0;
while (rset.next()) { 
    String lastName = rset.getString(1); 
    String mi = rset.getString(2); 
    String firstName = rset.getString(3); 
    String title = rset.getString(4); 
    String grade = rset.getString(5); 
    s.append(firstName).append(" ").append(mi).append(" ").append(lastName).append("'s grade on course ").append(title).append(" is ").append(grade).append("\n");     
    c++;
}
if(c>0) {
    lblStatus.setText(s.toString());
} else {
    lblStatus.setText("Not found");
}

Обратите внимание, что используя while, вы создаете al oop, который будет повторяться до тех пор, пока условие rset.next() не останется true, т. Е. До тех пор, пока в наборе результатов не будет больше элементов.

0 голосов
/ 29 февраля 2020

Я просто добавлю формулировку для других ваших ответов, чтобы вы знали, в чем разница. Когда вы спросили «есть ли у него следующий» ... он ответил «да», выполнил блок if ... один раз ... и затем пошел дальше. Это был не 1014 *. Он просто сказал ... да, у меня есть следующий.

Пока ... это все oop. Это будет продолжать выполнять кодовый блок while, в al oop, пока не останется больше nexts. Все, что вы спрашиваете, если есть хотя бы один. Вы сделали, поэтому он дал вам ваш «один», который вы просили, и пошел дальше.

Вот почему мы используем время l oop, чтобы прочитать весь набор результатов из базы данных.

while (rs.next ()) {...}

, если ... не все oop. Он делает один, если есть следующий, а затем просто идет дальше.

, пока ... это все oop. Это будет l oop до тех пор, пока больше не останется следующего.

Надеюсь, это поможет вам понять разницу между приложениями logi c между if и while. Мы используем некоторое время, чтобы обработать все последующие, потому что все oop будет повторяться, пока условие выполняется. Если просто говорит ... да, у меня есть следующий ... он блокирует один раз (или нет), а затем уходит. Вот почему вам нужно было какое-то время.

0 голосов
/ 29 февраля 2020

Измените

if (rset.next()) {

на

while (rset.next()) {

Вам также нужно избавиться от этого бита:

    } else { 
      lblStatus.setText("Not found"); 

Если вы хотите получить это сообщение тогда вам нужно посчитать, сколько строк вы обрабатываете в while l oop, или иметь логический флаг, который вы установили в true, как только увидели строку; затем проверьте это после завершения l oop и напечатайте сообщение, если флаг все еще ложен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...