java - 执行子查询后无法返回 JDBC SQL 查询结果

标签 java sql jdbc resultset

我正在研究一个场景,我必须在 JDBC 中执行 SQL 查询来查找注册特定学科的学生的信息。运行此查询时,一次应显示 3 条记录。然后系统会提示用户按 Enter 返回主菜单,或按 B 继续浏览结果,或输入 StudentID 以提取上学期的结果。在下面的代码中,显示 3 个结果后,当用户按 Enter 或 B 时,我的代码可以正常工作。但是,输入 StudentID 并运行子查询后,代码会自动显示主菜单。我希望它返回并继续显示剩余的结果,就像选项 B 浏览一样。

下面是代码片段:

// 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();
            }
        }
    }
}

最佳答案

首先,您不应该使用相同的 Statement不同查询的对象如果您使用相应的ResultSet可以互换。为“外部”查询创建一条语句,为子查询创建另一条语句。

其次,在 while -loop ( setId.next() ) 您可能从错误的 ResultSet 读取数据(应该 setID.getString() ,而不是 setISBN.getString() )。

此外,如果 SQL 查询是根据用户输入生成的,那么您绝对应该使用 PreparedStatement反而。考虑一下当有人进入 StudentId 时会发生什么如:

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

关于java - 执行子查询后无法返回 JDBC SQL 查询结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15407209/

相关文章:

java - 尝试从以前的数组创建 ArrayList<Object> - Java

java - 从 wicket 消息中设置 html 元素属性

sql - SQL 中的 Count if 或 Count where

sql - 如何在存储过程中选择插入的值?

java - Log4j2 - 如何配置 JDBC Appender?

jdbc - SPARK SQL - 使用 DataFrames 和 JDBC 更新 MySql 表

jdbc - Elasticsearch JDBC River吞噬了整个内存

java - 如何处理包改变的Java序列化对象?

java - 如何清除 jTable 的内容?

mysql - 如果单元格重复,则用新值更新单元格