Java 结果集关闭后,不允许执行结果集、空指针异常和SQLException操作
我是java和SQL新手,我在重复一个我不知道如何避免的问题: 假设我要创建两个executeQuery,一个在getRequestsFromDB方法中,一个在另一个内部,我创建第一个executeQuery,而在第二个方法中,我创建第二个executeQuery的是Professional HassThat Professional:Java 结果集关闭后,不允许执行结果集、空指针异常和SQLException操作,java,sql,Java,Sql,我是java和SQL新手,我在重复一个我不知道如何避免的问题: 假设我要创建两个executeQuery,一个在getRequestsFromDB方法中,一个在另一个内部,我创建第一个executeQuery,而在第二个方法中,我创建第二个executeQuery的是Professional HassThat Professional: private Vector<ClientRequest> getRequestsFromDB() throws SQLException {
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;
}
在第二个循环中,我得到一个SQLException:“ResultSet关闭后不允许操作”,我尝试了:
最后使用result.close()关闭结果,但我也得到异常null指针异常
我真的不知道该怎么处理,好吗?
谢谢大家! 您正在重用
\u语句(我假设它是全局的?)以获得两个不同的结果集,但在获得第二个结果集(在内部函数中,自动关闭第一个)后,您将返回到第1个结果集(在外部函数中)-尝试使用两个单独的语句检查此链接:http://download.oracle.com/javase/1.4.2/docs/api/java/sql/Statement.html
默认情况下,每个语句对象只能同时打开一个ResultSet对象。因此,如果一个ResultSet对象的读取与另一个ResultSet对象的读取交织在一起,则每个ResultSet对象都必须由不同的语句对象生成。如果存在打开的Statement对象,则Statement接口中的所有执行方法都会隐式关闭Statement的当前ResultSet对象
您正在重复使用您的声明参见以下引用:
- 当生成ResultSet对象的语句对象关闭、重新执行或用于从多个结果序列中检索下一个结果时,ResultSet对象将自动关闭
看起来您正在使用一个类或全局范围语句(\u Statement
),它支持您尝试迭代的结果集,并在isprofessionalhasthasprofession
方法中为结果集中的每个条目查询某种类型的详细信息。但是,当您使用相同的语句执行新查询时,旧结果集将关闭
因此,第二个查询需要一个单独的语句。来自Java API:
默认情况下,每个语句对象只能打开一个ResultSet对象
同时,。因此,如果读取一个ResultSet对象
与另一个的读取交错,每个都必须已生成
通过不同的语句对象
因此,您必须为第二个结果集
生成一个新的语句。请不要忘记分别关闭语句。可能的重复:和。此外,您还应该真正使用参数化SQL语句。
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;
}