2013-02-02 39 views
4

好的,我错过了什么?Java - H2数据库 - getGeneratedKeys()不返回任何结果

我有一个表作为这样:

CREATE TABLE PUBLIC.RESULTS 
(RESULTID IDENTITY NOT NULL, 
SOURCEID INTEGER NOT NULL, 
PARENTID INTEGER, 
NAME VARCHAR(25) NOT NULL, 
VALUE CLOB NOT NULL, 
PRIMARY KEY (RESULTID)) 

我试着具有RESULTID既与AUTO_INCREMENT和作为型IDENTITY一个INTEGER。

我用准备好的语句,并没有母校我做什么,试图设定的值时,我不断抛出“无数据”异常:

String sql = "INSERT INTO RESULTS (SOURCEID, PARENTID, NAME, VALUE) VALUES (?, ?, ?, ?)"; 
PreparedStatement stmt = null; 
stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); 
... {Truncated setting of values} ... 

stmt.executeUpdate(); 
conn.commit(); 
ResultSet rs2 = stmt.getGeneratedKeys(); 
rs2.next(); 
Integer a = rs2.getInt(1); 

当我真正看在数据库,数据插入正确,为RESULTID字段设置的下一个值就好了,我似乎无法返回该值。

我必须做一些愚蠢的事情,因为这应该工作。有任何想法吗?

既然有人问完整的堆栈跟踪低于:

org.h2.jdbc.JdbcSQLException: No data is available [2000-170] 
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:329) 
    at org.h2.message.DbException.get(DbException.java:169) 
    at org.h2.message.DbException.get(DbException.java:146) 
    at org.h2.message.DbException.get(DbException.java:135) 
    at org.h2.jdbc.JdbcResultSet.checkOnValidRow(JdbcResultSet.java:2957) 
    at org.h2.jdbc.JdbcResultSet.get(JdbcResultSet.java:2963) 
    at org.h2.jdbc.JdbcResultSet.getInt(JdbcResultSet.java:307) 
    at com.cigital.db.DefaultDb.storeValue(DefaultDb.java:147) 
    at com.cigital.db.DefaultDb.processResult(DefaultDb.java:115) 
    at com.cigital.db.DefaultDb.importScan(DefaultDb.java:84) 
    at com.cigital.gui.Default.jButImportActionPerformed(Default.java:373) 
    at com.cigital.gui.Default.access$400(Default.java:26) 
    at com.cigital.gui.Default$6.actionPerformed(Default.java:131) 
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) 
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) 
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) 
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) 
    at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:272) 
    at java.awt.Component.processMouseEvent(Component.java:6289) 
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3267) 
    at java.awt.Component.processEvent(Component.java:6054) 
    at java.awt.Container.processEvent(Container.java:2041) 
    at java.awt.Component.dispatchEventImpl(Component.java:4652) 
    at java.awt.Container.dispatchEventImpl(Container.java:2099) 
    at java.awt.Component.dispatchEvent(Component.java:4482) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577) 
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238) 
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168) 
    at java.awt.Container.dispatchEventImpl(Container.java:2085) 
    at java.awt.Window.dispatchEventImpl(Window.java:2478) 
    at java.awt.Component.dispatchEvent(Component.java:4482) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:644) 
    at java.awt.EventQueue.access$000(EventQueue.java:85) 
    at java.awt.EventQueue$1.run(EventQueue.java:603) 
    at java.awt.EventQueue$1.run(EventQueue.java:601) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98) 
    at java.awt.EventQueue$2.run(EventQueue.java:617) 
    at java.awt.EventQueue$2.run(EventQueue.java:615) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:614) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 
+0

您是否尝试过在提交连接之前获取生成的密钥?什么是异常的完整堆栈跟踪? –

+0

添加堆栈跟踪到帖子... – Doug

+0

我刚刚重新阅读您的文章,并意识到你建议我在做提交之前拉出钥匙。我回过头去修改代码中的代码,果然它可以工作!这对我来说似乎很奇怪......如果你想把它作为实际答案发布,我可以接受它...... – Doug

回答

7

你需要让生成的密钥之前犯下的连接,而不是之后。