gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:08:08 26 4
gpt4 key购买 nike

我正在尝试实现一个简单的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com