我有一个数据库和一个Java程序。我正在尝试编写代码,因此如果在文本字段中输入了MockID,并且按下了提交按钮,则应从数据库中检索根据输入的Mock ID的详细信息并显示在textarea中。下面是我写的代码。该代码现在在我做出修改后起作用。但是,在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);
答案 0 :(得分:4)
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,Subject,Year和Date硬编码到语句中,因此没有理由使用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);
答案 1 :(得分:1)
您的PreparedStatement
只有一个变量...... MockID
SELECT MockID,Subject,Year,Date FROM mockexam WHERE MockID =?.... so following statements
prest.setString(2, "Subject");
prest.setString(3, "Year");
prest.setString(4, "Date");
不是必需的。
Update for your comments
:
对于由“?”表示的所有变量,我们setString
....这里只有MockId是变量.....如果你想使用“select,你可以检索整行*“......但仍然只有一个参数(用?表示)到PreparedStatement
,那就是你的MockId
。
答案 2 :(得分:1)
?是绑定变量占位符。你只有1.那你为什么试图绑定4件事?
答案 3 :(得分:0)
“日期”不是列名的好选择。这是我所知道的每个数据库中的保留字。它对用户来说也不是很有用。生日?死亡日期?订购日期?这是什么意思?
我首先要更改为“EXAM_DATE”或其他内容,看看是否有帮助。
答案 4 :(得分:0)
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");
不要忘记关闭连接,语句和可能的结果集以避免内存泄漏。