Immer "nicht Begehen, wenn autocommit aktiviert ist" Ausnahme während der Arbeit mit CachedRowSet in JDBC

Ich versuche zu implementieren eine einfache GUI-Anwendung für die Arbeit mit Datenbank-Datensätzen. Es enthält eine Ansicht der Datensätze und die Möglichkeit, Sie zu Bearbeiten. Hier ist, wie mein code sieht wie folgt aus:

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());
        }
    }
}

Fuß zur nächsten und vorherigen arbeiten richtig. Aber ich bekomme eine Ausnahme beim speichern von Datensätzen. Der stack trace ist folgende:

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)
    ...

Wie kann ich verhindern, dass diese Ausnahme? Was ist auto-commit? Ich weiß, dass die Connection-Klasse hat eine option auf false gesetzt, aber ich don ' T wollen, verwenden Sie die Connection-Klasse. Ich möchte erreichen, alles mit CachedResultSet. Wie kann ich dieses problem beheben?

InformationsquelleAutor user2191938 | 2013-03-20
Schreibe einen Kommentar