try{ //taking input from user about how much balance Scanner input = new Scanner(System.in); Class.forName("net.ucanaccess.jdbc.UcanaccessDriver"); String url = "jdbc:ucanaccess://c://Bibek//Atmcard.accdb"; System.out.print("\nConnecting to database..."); con = DriverManager.getConnection(url); st = con.createStatement(); System.out.println("\n Enter balance you want to withdraw:\n"); balance = Double.parseDouble(input.nextLine()); String sql = "select AccountBalance From Atm"; result = st.executeQuery(sql); while(result.next()){ //assigning balanceFromDb to deduct and update in database Double balanceFromDb = result.getDouble("AccountBalance"); balanceFromDb=balanceFromDb-balance; result.updateDouble("AccountBalance", balanceFromDb); result.updateRow(); } }catch(Exception ex){ System.err.println(ex.toString()); }
输出:连接到数据库…输入要提取的余额:
20
net.ucanaccess.jdbc.UcanaccessSQLException:尝试分配给不可更新的列
检查访问数据库中的Atm对象,并确保它是表而不是查询。还要检查AccountBalance的数据类型,并确保它是可编辑字段。如果它是自动递增或计算的,则将无法更新。
编辑:看起来您必须声明它为可更新的游标。这是ucanacces上源于伪造的示例http://ucanaccess.sourceforge.net/site.html 使用可更新的ResultSet
PreparedStatement ps = super.ucanaccess.prepareStatement( "SELECT * FROM T1", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE, ResultSet.CLOSE_CURSORS_AT_COMMIT); rs = ps.executeQuery(); rs.next(); rs.updateString(2, "show must go off"); rs.updateRow();