JavaFX表格无法插入/更新SQL数据库问题求助
嘿,我看你遇到的麻烦了——JavaFX能正常读取SQL表数据,但插入和更新操作完全没效果,还没IntelliJ的报错提示,这确实让人摸不着头脑!我仔细看了你的代码,发现好几个关键问题,应该就是这些导致的:
1. 参数索引全错,所有值都覆盖到第一个占位符了
你在insert()方法里写的所有preparedStatement.setString(1, ...)都是用的索引1!这意味着你把所有文本框的值都往第一个?里塞,后面8个占位符根本没赋值,数据库收到的SQL参数完全不对,肯定执行失败。
正确的写法应该是按SQL语句里的占位符顺序,从1到9依次赋值,而且还要注意字段类型——你的SQL表里Spiele、Siege这些明显是数字类型,不能用setString,得转成整数后用setInt:
// 示例:按顺序赋值,数字类型转成int preparedStatement.setString(1, vereinFid.getText()); preparedStatement.setInt(2, Integer.parseInt(spieleFid.getText())); preparedStatement.setInt(3, Integer.parseInt(siegeFid.getText())); preparedStatement.setInt(4, Integer.parseInt(niederlagenFid.getText())); preparedStatement.setInt(5, Integer.parseInt(unentschiedenFid.getText())); preparedStatement.setInt(6, Integer.parseInt(toreFid.getText())); preparedStatement.setInt(7, Integer.parseInt(gegentoreFid.getText())); // 注意:Tordifferenz可以直接计算后传入,比如 Tore - Gegentore preparedStatement.setInt(8, Integer.parseInt(toreFid.getText()) - Integer.parseInt(gegentoreFid.getText())); preparedStatement.setInt(9, Integer.parseInt(punkteFid.getText()));
2. UPDATE语句没有WHERE子句,还少了主键参数
你写的UPDATE语句会把整个表的所有行都更新一遍,这绝对不是你想要的!必须加上WHERE子句指定要更新的行(比如根据表的主键ID),同时还要多一个占位符来传主键值:
// 假设你的表有个主键字段叫ID,记得根据实际表结构调整 query = "UPDATE `tabelle` SET " + "`Verein`=?," + "`Spiele`=?," + "`Siege`=?," + "`Niederlagen`=?," + "`Unentschieden`=?," + "`Tore`=?," + "`Gegentore`=?," + "`Tordifferenz`=?," + "`Punkte`=?" + " WHERE `ID`=?"; // 新增WHERE条件,指定要更新的行
然后在insert()方法里,还要给这个第10个占位符赋值(比如你需要先获取选中行的ID)。
3. 根本没执行SQL语句!
你的insert()方法只做了参数预处理,却没调用executeUpdate()把SQL发送给数据库执行!这是最关键的一步,漏掉的话数据库根本不会收到任何操作请求:
try { preparedStatement = connection.prepareStatement(query); // 这里先完成所有参数赋值... // 执行SQL,并获取受影响行数 int affectedRows = preparedStatement.executeUpdate(); // 可以加个提示告诉用户操作成功 if(affectedRows > 0) { Alert alert = new Alert(Alert.AlertType.INFORMATION); alert.setHeaderText(null); alert.setContentText(aktualisieren ? "数据更新成功!" : "数据插入成功!"); alert.showAndWait(); } } catch (SQLException exception) { Logger.getLogger(AddTabelleController.class.getName()).log(Level.SEVERE, null, exception); // 把异常信息弹给用户,这样你就能知道具体哪里错了! Alert alert = new Alert(Alert.AlertType.ERROR); alert.setHeaderText("数据库操作失败"); alert.setContentText(exception.getMessage()); alert.showAndWait(); } finally { // 别忘了关闭资源,避免数据库连接泄漏 try { if(preparedStatement != null) preparedStatement.close(); if(connection != null) connection.close(); } catch (SQLException e) { e.printStackTrace(); } }
4. 低级变量赋值错误
在speichern()方法里,你把Niederlagen的值错写成了spieleFid.getText(),应该是niederlagenFid.getText():
// 原来的错误代码 // String Niederlagen = spieleFid.getText(); // 修正后 String Niederlagen = niederlagenFid.getText();
5. 空值判断用了位运算符,逻辑不规范
你用的|是位运算符,虽然这里结果可能没问题,但逻辑判断应该用逻辑或||:
if (Verein.isEmpty() || Spiele.isEmpty() || Siege.isEmpty() || Niederlagen.isEmpty() || Unentschieden.isEmpty() || Tore.isEmpty() || Gegentore.isEmpty() || Punkte.isEmpty())
把这些问题都修正后,你的插入和更新操作应该就能正常工作了。另外,以后遇到这种没报错但操作没效果的情况,一定要把异常信息弹出来,这样就能直接看到数据库返回的错误提示,定位问题会快很多!
备注:内容来源于stack exchange,提问作者Rexonfury

