我試圖實現一個簡單的GUI應用程序來處理數據庫記錄。它將包含記錄視圖和編輯它們的可能性。下面是我的代碼的樣子:在使用JDBC中的CachedRowSet時獲取「無法提交自動提交時啓用自動提交」異常
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()...我也不會在任何地方創建Connection對象。我直接在CachedRowSet上工作。 – user2191938 2013-03-21 06:33:11
您正在創建一個具有getConnection方法的CachedRowSetImpl - 請參見[here](http://docs.oracle.com/cd/E17824_01/dsc_docs/docs/jscreator/apis/rowset/com/sun/rowset/CachedRowSetImpl html的#的getConnection%28%29)。 – Eran 2013-03-21 11:20:50
你是對的,我改變了類型,並看到getConnection()方法。但是當我調用crs.getConnection()時,我得到空值。爲什麼會發生? – user2191938 2013-03-21 13:07:23