对只转发结果集的无效操作: last--这样的错误

package dao;

import java.util.ArrayList;

import datebase.DBOperException;
import datebase.DBSource;
import java.sql.*;

import struts.form.TestForm;
import vo.userVO;
import tool.Page;

public class userDAO {

String sql = null;

//控制分页的属性
int page = 1;
int maxPage = 1;

//最大记录数量
private int maxRecordNumber=0;

public int getMaxPage() {
return maxPage;
}

public int getPage() {
return page;
}

public void setMaxPage(int maxPage) {
this.maxPage = maxPage;
}

public void setPage(int page) {
this.page = page;
}

/**
* @return maxRecordNumber
*/
public int getMaxRecordNumber() {
return maxRecordNumber;
}

/**
* @param maxRecordNumber 要设置的 maxRecordNumber
*/
public void setMaxRecordNumber(int maxRecordNumber) {
this.maxRecordNumber = maxRecordNumber;
}

/**
*
* @param testForm FORM对象
* @param requestpage 被请求的页
* @param pageNum 每页的数量(显示)
* @return
* @throws DBOperException
*/
public ArrayList selectUSERBASICINFO(TestForm testForm,int requestpage,int pageNum) throws DBOperException{

//广告信息列表
ArrayList adlist = new ArrayList();

// 需要的数据库对象
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;

try {
//查询条件
sql = "select userid,userpassword,phone,email from userbasicinfo where sex=?";
// 得到连接
conn = DBSource.getConnection();
//pstmt = conn.prepareStatement(sql);修改之前的语句
pstmt = conn.prepareStatement(sql,
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);//修改过的语句

pstmt.setString(1,testForm.getSex());
System.out.println(testForm.getSex());

//执行查询
rs = pstmt.executeQuery();

//得到最大的数量
int pageNumber = pageNum;

boolean last = rs.last();//将cursor移到最后
if(last){
int rowNumber = rs.getRow();//获取符合的数据条数

//设置列表中的显示数量
maxRecordNumber = rowNumber;

maxPage = rowNumber/pageNumber;
if(rowNumber % pageNumber > 0){
maxPage++;
}

}

//如果输入的页大于最大的页面,则选择最大的页面
if(requestpage >= maxPage){
page = maxPage;
}else{
this.page = requestpage;
}

//把查询到的历史信息组合成历史信息对象,然后添加到全部历史对象中
if(page > 1 && last){
rs.absolute(pageNumber * (page - 1));
}else if(page == 1 && last){
rs.beforeFirst();//将cursor移到初始状态
}
//把查询到的历史信息组合成历史信息对象,然后添加到全部历史对象中
int currentPosition = 0;

//把查找到的全部广告基本信息对象放到集合对象中
while(rs.next()&& currentPosition < pageNumber && last){
//创建一个VO对象???????????到底放while外面还是放while里面
userVO uservo= newuserVO();

uservo.setEmail(rs.getString("email"));
uservo.setPhone(rs.getString("phone"));
uservo.setUserid(rs.getString("userid"));
uservo.setUserpassword(rs.getString("userpassword"));


//把属性加入列表
adlist.add(uservo);
currentPosition ++ ;

}

} catch (SQLException ex) {
try {
conn.rollback();
} catch (SQLException e) {
e.printStackTrace();
}
ex.printStackTrace();
throw new DBOperException("数据库更新失败!");
} finally {
try {
// 关闭连接
rs.close();
pstmt.close();
conn.close();
} catch (SQLException ex1) {
ex1.printStackTrace();
}
}
//返回得到广告显示信息的列表
return adlist;
}
}

java.sql.SQLException: 对只转发结果集的无效操作: last
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:111)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:145)
at oracle.jdbc.driver.BaseResultSet.last(BaseResultSet.java:81)
at org.apache.tomcat.dbcp.dbcp.DelegatingResultSet.last(DelegatingResultSet.java:328)
at dao.userDAO.selectUSERBASICINFO(userDAO.java:86)
at struts.action.TestAction.execute(TestAction.java:54)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at tool.EncodeFilter.doFilter(EncodeFilter.java:42)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595)
2008-1-22 20:07:28 org.apache.struts.action.RequestProcessor processException
警告: Unhandled Exception thrown: class datebase.DBOperException
2008-1-22 20:07:28 org.apache.catalina.core.ApplicationContext log
信息: null


产生错误代码行:
pstmt = conn.prepareStatement(sql);
boolean last = rs.last();
将pstmt = conn.prepareStatement(sql);
改为:pstmt = conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

ResultSet.TYPE_SCROLL_INSENSITIVE 双向滚动,但不及时更新,就是如果数据库里的数据修改过,并不在ResultSet中反应出来。
ResultSet.TYPE_SCROLL_SENSITIVE 双向滚动,并及时跟踪数据库里的更新,以便更改ResultSet中的数据。
ResultSet.CONCUR_READ_ONLY 只读取ResultSet 。
ResultSet.CONCUR_UPDATABLE 用ResultSet更新数据库 。

你可能感兴趣的:(java,apache,oracle,sql,struts)