ResultSet 关闭后不允许出现 ResultSet、空指针异常和 SQLException 操作
Posted
技术标签:
【中文标题】ResultSet 关闭后不允许出现 ResultSet、空指针异常和 SQLException 操作【英文标题】:ResultSet, null pointer exception and SQLException operation not allowed after ResultSet closed 【发布时间】:2013-01-11 19:14:52 【问题描述】:我是 java 和 SQL 的新手,我重复了一个我不知道如何避免的问题:
假设我想做两个 executeQuery,一个在另一个里面,在 getRequestsFromDB 方法中我做第一个 executeQuery,在第二个方法 isProfessionalHasThatProfession 我做第二个 executeQuery:
private Vector<ClientRequest> getRequestsFromDB() throws SQLException
Vector<ClientRequest> retVal = new Vector<ClientRequest>();
ResultSet result = null;
try
for (int i=0 ; i<_userBean.getProfession().length ; ++i )
result = _statement.executeQuery("SELECT * FROM "+_dbName+"."+CLIENTS_REQUEST_TABLE+" WHERE "+CLIENTS_REQUEST_T_PROFESSION+"='"+_userBean.getProfession()[i]+"'");
while(result.next()) //HERE IN THE SECOND LOOP GETTING NULL EXCEPTION
if(isProfessionalHasThatProfession(result.getString(CLIENTS_REQUEST_T_PROFESSION)))
retVal.add(cr);
ClientRequest cr = new ClientRequest
(result.getString(CLIENTS_REQUEST_T_CLIENT_ID),
result.getString(CLIENTS_REQUEST_T_CITY),
result.getString(CLIENTS_REQUEST_T_DATE),
result.getString(CLIENTS_REQUEST_T_PROFESSION));
catch (SQLException ex)
throw ex;
return retVal;
第二个功能:
private boolean isProfessionalHasThatProfession(String profession) throws SQLException
ResultSet result = null;
try
result = _statement.executeQuery("SELECT "+WORKER_PROFESSIONS_T_PROFESSION+" FROM "+_dbName+"."+WORKER_PROFESSIONS_TABLE+" WHERE "+WORKER_PROFESSIONS_T_PROFESSIONAL_ID+"='"+_userBean.getProId()+"'");
while(result.next())
if(result.getString(1).equals(profession))
return true;
catch (SQLException ex)
throw ex;
return false;
在第二个循环中,我得到一个 SQLException:“ResultSet 关闭后不允许操作”,我尝试过: 最后用 result.close() 关闭结果,但我也得到异常空指针异常。
我真的不知道如何处理,想法? 谢谢!
【问题讨论】:
可能重复:***.com/questions/9291619/… 和 ***.com/questions/5840866/…。此外,您真的应该使用参数化的 SQL 语句。 【参考方案1】:您正在重用 _statement
(我认为它是全局的?)来获得 2 个不同的 ResultSet
s,但是在获得第二个(在内部函数中)之后,您返回到第一个 ResultSet
(在外部函数中)函数,它自动关闭第一个) - 尝试使用 2 个单独的语句
【讨论】:
【参考方案2】:查看此链接:http://download.oracle.com/javase/1.4.2/docs/api/java/sql/Statement.html
默认情况下,每个 Statement 对象只能同时打开一个 ResultSet 对象。因此,如果一个 ResultSet 对象的读取与另一个 ResultSet 对象的读取交错,则每个对象都必须由不同的 Statement 对象生成。 Statement 接口中的所有执行方法都会隐式关闭一个语句的当前 ResultSet 对象,如果存在打开的对象。
你正在重复使用你的语句
【讨论】:
【参考方案3】:请参阅来自ResultSet API 的引用:
当生成它的 Statement 对象关闭、重新执行或用于从多个结果序列中检索下一个结果时,ResultSet 对象会自动关闭。看起来您正在使用一个类或全局范围语句 (_statement
),它支持您尝试迭代的结果集,并为您的 @987654323 中的结果集中的每个条目查询某种类型的详细信息@ 方法。但是当您使用相同的 Statement
执行新查询时,您的旧 ResultSet 将关闭。
因此,第二个查询需要单独的语句。
【讨论】:
【参考方案4】:来自 Java API:
默认情况下,每个 Statement 对象只能打开一个 ResultSet 对象 同时。因此,如果读取一个 ResultSet 对象是 与另一个阅读交错,每个必须已经生成 通过不同的 Statement 对象。
所以你必须为第二个ResultSet
生成一个新的Statement
。请不要忘记分别关闭Statement
s。
【讨论】:
以上是关于ResultSet 关闭后不允许出现 ResultSet、空指针异常和 SQLException 操作的主要内容,如果未能解决你的问题,请参考以下文章
java.sql.SQLException:ResultSet关闭后不允许操作[重复]
获取 java.sql.SQLException:ResultSet 关闭后不允许操作