java.sql.SQLException:参数5没有指定值.更新数据库



我在对话框中有这个错误代码: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());



相关内容

  • 没有找到相关文章