结果集没有打开。验证自动提交已关闭。Apache Debry
技术问答
169 人阅读
|
0 人回复
|
2023-09-14
|
我正在使用我的数据库apache& _$ G' C* K5 U% t: r4 m
derby。我可以插入数据库。以下是试图显示我唯一的表’MAINTAB’代码摘录的内容。java.sql.Connection的实例为’dbconn’。
9 s C9 J+ H- K: M ResultSet word; Statement query; String getData="SELECT THEWORD FROM MAINTAB"; try{ System.out.println(dbconn.getAutoCommit()); query = dbconn.createStatement();;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;word = query.executeQuery(getData); query.close();;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;dbconn.setAutoCommit(false); System.out.println(dbconn.getAutoCommit()); for(;word.next();;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;System.out.println(word.getString(1)catch(Throwable e){ System.out.println("Table fetch failed or result data failed");}以下是输出。% s9 T7 F% B' J; ]
org.apache.derby.jdbc.EmbeddedDriver loaded.Database testDB connectedtruefalseTable fetch failed or result data failed---SQLException Caught---SQLState: XCL16Severity: 20000Message: ResultSet not open. Operation 'getString' not permitted. Verify that autocommit is OFF.java.sql.SQLException: ResultSet not open. Operation 'getString' not permitted. Verify that autocommit is OFF. at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source) at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source) at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source) at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source) at org.apache.derby.impl.jdbc.EmbedConnection.newSQLException(Unknown Source) at org.apache.derby.impl.jdbc.ConnectionChild.newSQLException(Unknown Source) at org.apache.derby.impl.jdbc.EmbedResultSet.checkIfClosed(Unknown Source) at org.apache.derby.impl.jdbc.EmbedResultSet.getString(Unknown Source)Closed connection at test.ShowData.main(ShowData.java:30)Caused by: java.sql.SQLException: ResultSet not open. Operation 'getString' not permitted. Verify that autocommit is OFF. at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source) at org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(Unknown Source) ... 9 moreDatabase shut down normally第一次要求验证时AUTOCOMMIT是否为OFF时,我从Derby文档中发现默认情况下AUTOCOMMIT打开任何连接。所以,我已经用过了dbconn.setAutoCommit(false)关掉它。还是会造成错误。
7 g j/ X7 z4 A- u" I9 p. h+ Z错误之前的输出描述结果集已经正确获得。另外,请注意,即使我AutoCommit设置为false,也会导致同样的错误。同时,我在日食上跑德比。% T& Z+ o5 P9 E; X4 h
6 q& u( Y B$ e$ G 解决方案:
% l) U1 o8 u- p0 x2 c3 e$ V 问题是您 在 读取结果集 之前 已关闭查询。关闭查询,关闭结果集,所以为什么会出现 ResultSet not# b& c3 W- [8 {' t* v) u
open错误。你应该在那里finally块末立即关闭查询:: Y; ~: F. X' ]; O: E) W a) r3 X
ResultSet word;Statement query=null;String getData="SELECT THEWORD FROM MAINTAB";try{ System.out.println(dbconn.getAutoCommit(); query = dbconn.createStatement(); word = query.executeQuery(getData); dbconn.setAutoCommit(false); System.out.println(dbconn.getAutoCommit(); for(;word.next()System.out.println(word.getString(1));}catch(Throwable e){ System.out.println("Table fetch failed or result data failed");} finally{ if(query!=null) try query.close(); } catch(SQLException ex) System.out.println("Could not close query"); |
|
|
|
|
|