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

问题描述

当我尝试将 JTable/JTextFields 更新到我的 sql 数据库时,对话框中出现以下错误代码means

我在网站上查过类似的问题,但似乎没有解决我的问题。我检查了数据库,检查了我的连接代码,更新代码,但找不到这个额外的参数应该在哪里?请帮助新的初学者!

所以现在我明白问题出在我怀疑的 mask 处,但我的 id 仅作为行计数/主键存在于我的 sql 数据库中,因此它会因您的行而有所不同选择/点击,所以我不能在 True 预先设置一个特定的值。然后插入什么 - 这样我就不会丢失 JTable 中客户列表中的自动行计数?

java.sql.sqlException: No value specified for parameter 5

解决方法

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 是非常低级的,对于“最终用户”编码来说并不是那么好。使用一个很好的抽象,比如 JDBIJOOQ

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 是否真的支持 - 不确定,你必须检查。

,

我的问题的解决方案是为 pst. 插入第 5 个 id=? 语句,如下所示:

pst.setInt(5,table.getRowCount());
            
            
            

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...