【问题标题】:Java MySQL PreparedStatement SELECT Statement [closed]Java MySQL PreparedStatement SELECT 语句 [关闭]
【发布时间】:2012-03-08 16:47:24
【问题描述】:

我有一个数据库和一个 Java 程序。我正在尝试编写代码,以便如果在文本字段中输入 MockID 并按下提交按钮,则应从数据库中检索根据输入的 Mock ID 的详细信息并显示在文本区域中。下面是我写的代码。在我进行修改后,代码现在可以工作了。但是,在 textarea 中,它实际上并没有显示来自给定 Mock Id 的记录中的相关信息,而只是显示文本。 有人可以建议吗?

    JButton button = new JButton("Submit");
    button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {


        String mockId = textField.getText();    

        try {

            String sql = "SELECT MockID, Subject, Year, Date FROM mockexam WHERE MockID =?";    

            PreparedStatement prest = con.prepareStatement(sql);
            prest.setString(1, mockId);

            prest.executeQuery();
            textArea.append("MockID, Subject, Year, Date");
            JOptionPane.showMessageDialog(frmFindMock, "Record has been updated.");


        }

        catch (SQLException e) {
        //System.out.println("Record couldn't be added!");
        e.printStackTrace();
        JOptionPane.showMessageDialog(frmFindMock, "Record couldn't be updated. Please try again.");
        }
        }

        });

    button.setBounds(303, 60, 75, 23);
    panel_1.add(button);

【问题讨论】:

    标签: java prepared-statement


    【解决方案1】:
            String sql = "SELECT MockID, Subject, Year, Date FROM mockexam WHERE MockID =?";    
    
            PreparedStatement prest = con.prepareStatement(sql);
            prest.setString(1, "MockID");
            prest.setString(2, "Subject");
            prest.setString(3, "Year");
            prest.setString(4, "Date");
    

    这就是问题所在。在您的 sql 字符串中,您为 1 个参数(由 ? 表示)腾出了空间,但随后您尝试设置 4。因此您超出了界限。此外,由于您将 MockID、主题、年份和日期硬编码到语句中,因此没有理由使用 setString 尝试设置它们(错误地)。

    要显示答案,请执行以下操作:

    ResultSet rs = prest.executeQuery();
    String result;
    while(rs.next()) {
        String id = rs.getString("MockID");
        String subject = rs.getString("Subject");
        String year = rs.getString("Year");
        String Date = rs.getString("Date");
        result += id + ", " + subject + ", " + year + ", " + date + "\n";
    }
    textarea.append(result);
    

    【讨论】:

    • 我希望 Mock ID、主题、年份和日期在 TextArea 中显示为结果。为什么我有 WHERE MockID =?是因为应该为用户输入的特定 MockID 显示信息?
    • 例如:String sql = "SELECT MockID, Subject, Year, Date FROM mockexam WHERE MockID =?"; PreparedStatement prest = con.prepareStatement(sql); prest.setString(1, "1"); 将从数据库中为带有MockID=1 的任何条目选择COLUMNS MockID、主题、年份和日期
    • 哦,我明白你的意思了。我将尝试修改代码,因为我知道你的意思:)
    • 我已将代码修改为 prest.setString(1, mockId);。它现在部分工作,但实际上并没有显示数据库中记录的相关数据,而是显示为文本:模拟 ID、主题、年份、日期。这是我用于文本区域的代码: textArea.append("Mock ID, Subject, Year, Date");
    • 那是因为您将字符串 MockID 主题年份日期附加到文本区域,您必须从数据库中获取 ResultSet 并从 resultSet 中获取该数据。我会添加代码给我一秒钟。
    【解决方案2】:

    那个?是绑定变量占位符。你只有 1 个。那你为什么要绑定 4 个东西?

    【讨论】:

      【解决方案3】:

      你的PreparedStatement只有一个变量..即MockID

      SELECT MockID, Subject, Year, Date FROM mockexam WHERE MockID =?..so 以下语句

                      prest.setString(2, "Subject");
                      prest.setString(3, "Year");
                      prest.setString(4, "Date");
      

      不是必需的。

      Update for your comments

      我们对所有由“?”表示的变量执行setString......这里只有 MockId 是一个变量......如果需要,您可以使用“select *”检索整行...但PreparedStatement 仍然只有一个参数(由?表示),那就是你的MockId

      【讨论】:

      • 我希望 Mock ID、主题、年份和日期在 TextArea 中显示为结果。为什么我有 WHERE MockID =?是因为应该为用户输入的特定 MockID 显示信息?
      • 是的,我知道...我们为所有由“?”表示的变量执行 setString ....这里只有 MockId 是一个变量......您可以检索整行如果你想通过使用“select *”......但仍然只有一个参数(由?表示)到 PreparedStatement,那就是你的 MockId
      【解决方案4】:

      “日期”不是列名的好选择。这是我所知道的每个数据库中的保留字。对于用户来说,它的信息量也不是很大。出生日期?死亡日期?订购日期?什么意思?

      我会先更改为“EXAM_DATE”或其他内容,看看是否有帮助。

      【讨论】:

        【解决方案5】:
        String sql = "SELECT MockID, Subject, Year, Date FROM mockexam WHERE MockID =?";    
        

        在准备此声明时,您“说”您将为每个? 赋值。 这里你只有一个,但你稍后会定义其中的 4 个:

            PreparedStatement prest = con.prepareStatement(sql);
            prest.setString(1, "MockID");
            prest.setString(2, "Subject");
            prest.setString(3, "Year");
            prest.setString(4, "Date");
        

        并且不要忘记关闭你的连接、语句和可能的结果集以避免内存泄漏。

        【讨论】:

        • 我希望 Mock ID、主题、年份和日期在 TextArea 中显示为结果。为什么我有 WHERE MockID =?是因为应该为用户输入的特定 MockID 显示信息?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-05
        • 2016-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多