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

Java程序向Access数据库插入数据显示#Deleted问题排查求助

解决Access数据库插入后显示#Deleted的问题

我来帮你排查这个头疼的#Deleted问题,这种情况在Java用UCanAccess连接Access数据库时挺常见的,咱们一步步拆解原因并解决:

1. 优先检查表的主键设置

Access表如果没有主键,或者主键字段不唯一、允许为空,UCanAccess插入数据后很容易出现所有行显示#Deleted的情况。

  • 打开你的Hospital.accdb,找到Patient表,确认PatientID字段被设置为主键,并且字段类型(比如文本型)和你输入的PatientID格式匹配,长度足够容纳输入内容。

2. 核对SQL插入语句的字段名

你的插入语句里的字段名必须和Access表的实际字段名完全一致(大小写不敏感,但拼写要精准):

st.executeUpdate("insert into Patient(PatientID,Pname,ContactNumber,ages,gender,bloodGroup,address,anyMajorDisease) values(...)");

比如检查:

  • 表中的年龄字段是叫ages还是Age?
  • Pname是不是表中实际的字段名(比如会不会是PatientName)?
    字段名不匹配会导致数据插入异常,虽然程序没报错,但Access无法正确识别数据,就会显示#Deleted。

3. 关闭数据库资源,避免连接泄漏

你的代码里用完Connection和Statement后没有关闭,这会导致数据库连接泄漏,引发数据显示异常。一定要在finally块里关闭资源:

Connection connection = null;
Statement st = null;
try {
    String url="jdbc:ucanaccess://Hospital.accdb";
    connection=DriverManager.getConnection(url);
    st=connection.createStatement();
    st.executeUpdate("insert into Patient(...) values(...)");
    JOptionPane.showMessageDialog(null,"Added New Patient Record Successfull");
}catch(Exception ex){
    ex.printStackTrace();
} finally {
    // 确保资源被关闭
    try {
        if(st != null) st.close();
        if(connection != null) connection.close();
    } catch(SQLException e) {
        e.printStackTrace();
    }
}

4. 替换Statement为PreparedStatement,避免SQL注入和拼接错误

你用字符串拼接SQL语句的方式,不仅有SQL注入风险,还可能因为输入内容包含单引号(比如名字是O'Neil)导致SQL语句隐性错误,进而引发数据异常。改用PreparedStatement更安全可靠:

Connection connection = null;
PreparedStatement pstmt = null;
try {
    String url="jdbc:ucanaccess://Hospital.accdb";
    connection=DriverManager.getConnection(url);
    // 这里要确保字段名和表中完全一致,比如如果年龄字段是数字类型,字段名改成Age
    String sql = "insert into Patient(PatientID,Pname,ContactNumber,Age,gender,bloodGroup,address,anyMajorDisease) values(?,?,?,?,?,?,?,?)";
    pstmt = connection.prepareStatement(sql);
    pstmt.setString(1, PatientID);
    pstmt.setString(2, Pname);
    pstmt.setString(3, ContactNumber);
    // 如果Age是数字类型,转成int再插入(要处理格式错误的情况)
    try {
        pstmt.setInt(4, Integer.parseInt(ages));
    } catch(NumberFormatException e) {
        JOptionPane.showMessageDialog(null,"请输入有效的年龄数字");
        return;
    }
    pstmt.setString(5, gender);
    pstmt.setString(6, bloodGroup);
    pstmt.setString(7, address);
    pstmt.setString(8, anyMajorDisease);
    pstmt.executeUpdate();
    JOptionPane.showMessageDialog(null,"Added New Patient Record Successfull");
}catch(Exception ex){
    ex.printStackTrace();
} finally {
    try {
        if(pstmt != null) pstmt.close();
        if(connection != null) connection.close();
    } catch(SQLException e) {
        e.printStackTrace();
    }
}

5. 检查UCanAccess版本兼容性

确保你使用的UCanAccess版本和Access数据库版本兼容。比如旧版UCanAccess对新版.accdb文件支持不佳,建议升级到最新稳定版(比如5.0.x系列),同时配套齐全相关依赖包(jackcess、commons-lang3等)。

按这个顺序排查,应该能解决#Deleted的问题。

内容的提问来源于stack exchange,提问作者user14389228

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:28:06