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
相关产品推荐
相关产品推荐

