我是java和SQL的新手,我重复一个我不知道如何避免它的问题:
假设我想在getRequestsFromDB方法中创建两个executeQuery,一个在另一个内部,我创建第一个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()关闭结果,但我也得到异常空指针异常。
我真的不知道如何处理这些想法? 谢谢!
答案 0 :(得分:2)
你重新使用_statement
(我假设它是全局的吗?)获得2个不同的ResultSet
s,但是在你得到之后你会回到第一个ResultSet
(在外部函数中)第二个(内部函数内部,自动关闭第一个) - 尝试使用2个单独的语句
答案 1 :(得分:0)
检查此链接:http://download.oracle.com/javase/1.4.2/docs/api/java/sql/Statement.html
默认情况下,每个Statement对象只能同时打开一个ResultSet对象。因此,如果读取一个ResultSet对象与另一个ResultSet对象的读取交错,则每个ResultSet对象必须由不同的Statement对象生成。如果存在一个开放的对象,则Statement接口中的所有执行方法都会隐式关闭该语句的当前ResultSet对象。
您正在重复使用您的陈述
答案 2 :(得分:0)
看起来您正在使用一个类或全局范围的Statement(_statement
),它支持您尝试迭代的结果集,并查询结果集中每个条目的某种类型的详细信息。 isProfessionalHasThatProfession
方法。但是当您使用相同的Statement
执行新查询时,旧的ResultSet将被关闭。
因此,您需要为第二个查询单独声明。
答案 3 :(得分:0)
来自Java API:
默认情况下,每个Statement对象只能打开一个ResultSet对象 同时。因此,如果读取一个ResultSet对象是 与另一个的读取交错,每个必须已经生成 通过不同的Statement对象。
因此,您必须为第二个Statement
生成新的ResultSet
。请不要忘记分别关闭Statement
。