You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaFX表格无法插入/更新SQL数据库问题求助

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 09:44:37