java - 在 JDBC 中使用 CachedRowSet 时出现 "cannot commit when autocommit is enabled"异常

标签 java postgresql jdbc

我正在尝试实现一个简单的 GUI 应用程序来处理数据库记录。它将包含记录 View 和编辑它们的可能性。这是我的代码的样子:

class MainPanel extends JPanel {

    private CachedRowSet crs;
    private List<JTextField> fields = new LinkedList<>();

    MainPanel() {
        try {
            //Fill result set with data
            crs = new CachedRowSetImpl();
            crs.setUrl("jdbc:postgresql:testdb");
            crs.setUsername("username");
            crs.setPassword("password");
            crs.setCommand("SELECT * FROM products");
            crs.execute();

            //Create text fields with labels
            ResultSetMetaData meta = crs.getMetaData();
            for (int a = 1; a <= meta.getColumnCount(); a++) {
                JTextField field = new JTextField(10);
                add(new JLabel(meta.getColumnLabel(a)));
                fields.add(field);
                add(field);
            }

            //Fill fields on startup
            crs.next();
            updateFields();

            //Buttons
            JButton nextButton = new JButton("Next");
            nextButton.addActionListener(...);
            add(nextButton);

            JButton prevButton = new JButton("Previous");
            prevButton.addActionListener(...);
            add(prevButton);

            JButton saveButton = new JButton("Save changes");
            saveButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent event) {
                    try {
                        for (int a=0; a<fields.size(); a++) {
                            crs.updateString(a+1, fields.get(a).getText());
                        }
                        crs.acceptChanges();
                    } catch (SQLException ex) {
                        ex.printStackTrace();
                    }
                }
            });
            add(saveButton);
        }
        catch (SQLException ex) {
            ex.printStackTrace();
        }
    }

    private void updateFields() throws SQLException {
        for (int a = 0; a < fields.size(); a++) {
            fields.get(a).setText(crs.getString(a + 1).trim());
        }
    }
}

走下一个和前一个工作正常。但是我在尝试保存记录时遇到异常。堆栈跟踪如下:

org.postgresql.util.PSQLException: Cannot commit when autoCommit is enabled.
    at org.postgresql.jdbc2.AbstractJdbc2Connection.commit(AbstractJdbc2Connection.java:705)
    at com.sun.rowset.internal.CachedRowSetWriter.commit(CachedRowSetWriter.java:1396)
    at com.sun.rowset.CachedRowSetImpl.acceptChanges(CachedRowSetImpl.java:893)
    at test.MainPanel$3.actionPerformed(MainPanel.java:85)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
    ...

如何防止这种异常?什么是自动提交?我知道 Connection 类有一个选项可以将其设置为 false,但我不想使用 Connection 类。我想使用 CachedResultSet 来完成所有事情。我该如何解决这个问题?

最佳答案

只需添加

crs.getConnection().setAutoCommit(false);

关于java - 在 JDBC 中使用 CachedRowSet 时出现 "cannot commit when autocommit is enabled"异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15530266/

相关文章:

java - 在谷歌中搜索单词并希望使用java程序找到每个单词的命中

java - 使用 Java 的 SunMSCAPI/Windows-MY 访问智能卡证书以进行 TLS/SSL 连接并进行客户端身份验证

java - 我使用 POST 方法在 header 部分发送用户凭据

linux - 爬虫服务端

java - 一个 sql 查询来检查唯一性

hadoop - 如何获取 hdfs 文件上最后添加的数据?

java - 在 Java 中读取更新时的 SQL 时间戳

sql - 我怎样才能得到每列的总和?

Java ResultSet、SetObject 与 SetString/SetDate/等

java - 与远程计算机上运行的 SQL Server 2005 实例的 JDBC 连接