我在对话框中有这个错误代码:java.sql.SQLException: No value specified for parameter 5
当我试图更新我的JTable/JTextFields到我的SQL数据库
我在网站上检查了类似的问题,但似乎没有解决我的问题。我已经检查了数据库,我已经检查了我的连接代码,更新代码,找不到这个额外的参数使问题应该在哪里?请帮助一个新的初学者!
所以现在我明白问题是在WHERE id=?
,因为我怀疑,但我的id只存在作为行数/主键在我的SQL DB,所以它将是不同的,这取决于你选择/点击哪一行,所以我不能事先在pst.setInt(5, ? )
设置一个特定的值。然后插入什么-这样我就不会失去JTable中客户列表上的自动行计数?
//This method contains all codes for database connection.
private void upDateDB() {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/num klienter", "root", "");
PreparedStatement pst = con.prepareStatement("SELECT * FROM klient");
ResultSet rs =pst.executeQuery();
ResultSetMetaData StData = rs.getMetaData();
q = StData.getColumnCount();
DefaultTableModel RecordTable = (DefaultTableModel)table.getModel();
RecordTable.setRowCount(0);
while(rs.next()){
Vector<String> columnData = new Vector<String>();
for (i = 1; i <= q; i++) {
columnData.add(rs.getString("id"));
columnData.add(rs.getString("Name"));
columnData.add(rs.getString("Birthday"));
columnData.add(rs.getString("Description"));
columnData.add(rs.getString("Other"));
}
RecordTable.addRow(columnData);
}} catch (Exception ex) {
JOptionPane.showMessageDialog(null, ex);
}}
updateButton.addActionListener(new ActionListener() {
public void actionPerformed (ActionEvent arg0) {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost/num klienter", "root", "");
PreparedStatement pst = con.prepareStatement("UPDATE klient SET Name=?,Birthday=?,Description=?,Other=? WHERE id=?");
table.getSelectedRow();
pst.setString(1, nameTxt.getText());
pst.setString(2, dayTxt.getText()+"-" + monthTxt.getText()+"-" + yearTxt.getText());
pst.setString(3, descriptionTxt.getText());
pst.setString(4, otherTxt.getText());
pst.executeUpdate();
JOptionPane.showMessageDialog(null, "Updated in database");
upDateDB();
}catch (Exception ex){
JOptionPane.showMessageDialog(null, ex);
}
Class.forName("com.mysql.cj.jdbc.Driver");
可以删除。这已经20年没有必要了。
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/num klienter", "root", "");
这是内存泄漏;连接已打开,并将永远保持打开状态;你的SQL服务器不会允许超过几个打开的连接,所以很快你的MySQL服务器将无法访问任何服务(包括这段java代码),直到你杀死关闭连接的java应用程序。对所有创建的资源使用try with resources。
PreparedStatement pst = con.prepareStatement("SELECT * FROM klient");
这也是一个资源,需要try-with-resources。
ResultSet rs =pst.executeQuery();
你猜对了。第三次尝试使用资源。如果您发现代码变得笨拙,那么JDBC是非常低级的,对于"最终用户"编码来说并不是那么好。使用像jdbc或JOOQ这样好的抽象。
columnData.add(rs.getString("Fødselsdag"));
列名称非ascii ?这不会顺利的。我强烈建议你不要这样做。
q = StData.getColumnCount();
for (i = 1; i <= q; i++) {
这太奇怪了。q保存列计数-这是查询中的列数。然后硬编码这5个列名,所以q总是5。然后,添加所有5个值(id、Navn、Fødselsdag等),然后这样做5次,总共运行25次,数据重复5次。通过请求已知信息(从元数据中获取列数,这是您已经知道的),您试图完成的目的并不清楚。
PreparedStatement pst = con.prepareStatement("UPDATE klient SET Navn=?,Fødselsdag=?,Beskrivelse=?,Andet=? WHERE id=?");
我计数了5个?
语句,但只有4个pst.setString
语句。你忘了pst.setInt(5, theValue)
。
更新代码得到所有相同的关于try-with-resources的警告。
pst.setString(2, dayTxt.getText()+"-" + monthTxt.getText()+"-" + yearTxt.getText());
和db约会可不是这样的。有一个pst.setDate
,但最好使用pst.setObject
,传递一个java.time.LocalDate
的实例。MySQL是否真的支持-不确定,你必须检查。
我的问题的解决方案是为id=?
插入第5条pst.
语句,如下所示:
pst.setInt(5,table.getRowCount());