解决java.sql.SQLException: After end of result set

出现java.sql.SQLException: After end of result set主要是ResultSet 结果集中的指向结果集的光标在最后一行,数据已经一个一个向下指,最后没了,你接着再往后指,就出现这个异常了。

如果光标在第一行之前,使用 rs.getXX()获取列值,报错:Before start of result set
如果光标在最后一行之后,使用 rs.getXX()获取列值,报错:After end of result set

当然博主出现这个异常主要是因为引用了多个结果集的时候,由于前一个结果集已经和数据库关闭,你再次引用,所以出现java.sql.SQLException: After end of result set

我先声明这个案例的解决方式:由于高密度的PreparedStatement、ResultSet的频繁操作,全局的Connection 、PreparedStatement 、ResultSet 很容易出现前一个结果集已经和数据库关闭情况【每个方法每次都调用了 DBUtil.close(conn, ps, rs)】,所以把定义为全局的数据库连接放进方法中独自享用!

出错案例:

dao.impl代码
(注意:为了代码的可读性,我将impl中其他的方法去掉了)
【特别注意:定义的数据库连接是全局的私有属性】

public class FangYuanImpl implements IFangYuanDao{

	private Connection conn;
	private PreparedStatement ps;
	private ResultSet rs;
	//注意:定义的数据库连接是全局的
	@Override
	public FangYuanPo HuiTianFYByid(int fangyuanid) {
		List<ClientCLKPo> list=new ArrayList<ClientCLKPo>();
		ClientCLKPo selectvo=null;
		try {
			conn=DBUtil.getConnection();
			ps=conn.prepareStatement(findclientXLK);
			rs=ps.executeQuery();
			while(rs.next()){
				selectvo=new ClientCLKPo();
				selectvo.setId(rs.getInt("clientid"));
				selectvo.setText(rs.getString("name"));
				list.add(selectvo);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block     ArrayList<Novel> novellist2 = new  ArrayList<Novel>();
			e.printStackTrace();
		}finally{
			DBUtil.close(conn, ps, rs);
		}
		
		return list;
	}
	}

servlet代码

public void HuiTianFYByid(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
      String fangyuanid=request.getParameter("fangyuanid");
      
      FangYuanPo fangyuanpo=new FangYuanPo();
      fangyuanpo=marketingService.HuiTianFYByid(Integer.parseInt(fangyuanid));
      JSONObject jsonobject=JSONObject.fromObject(fangyuanpo);//返回json格式对象
      PrintWriter out=response.getWriter();
      out.write(jsonobject.toString());
      System.out.println("你的"+jsonobject.toString());
      out.flush();
      out.close();
      
	}

JSP代码:

 var FangYuanID = tbProgressTemplate1.getColumnValue(Index, "fangyuanid");
                $.post("${ctx}/servlet/MarketingServlet",{"fun":"HuiTianFYByid",fangyuanid:FangYuanID}, function (date) {
					json = eval('(' + date + ')');//js获取json格式的属性数据
					console.log(json.fangyuanname);
                   loadDatatoForm("form", json);//封装的方法
                });

页面服务请求情况: 其实我数据库查出的数据不止三条,由于前一个结果集已经和数据库关闭,之后的数据就直接铺街了QAQ
在这里插入图片描述

再后来就诞生了下面的可爱的java代码QAQ
在这里插入图片描述
决绝方法:把定义为全局的数据库连接放进方法中独自享用

public List<ClientCLKPo> findclientXLK() {
//把定义为全局的数据库连接放进方法中独自享用
		 Connection conn=null;
		 PreparedStatement ps=null;
		 ResultSet rs=null;
		
		List<ClientCLKPo> list=new ArrayList<ClientCLKPo>();
		ClientCLKPo selectvo=null;
		try {
			conn=DBUtil.getConnection();
			ps=conn.prepareStatement(findclientXLK);
			rs=ps.executeQuery();
			while(rs.next()){
				selectvo=new ClientCLKPo();
				selectvo.setId(rs.getInt("clientid"));
				selectvo.setText(rs.getString("name"));
				list.add(selectvo);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block     ArrayList<Novel> novellist2 = new  ArrayList<Novel>();
			e.printStackTrace();
		}finally{
			DBUtil.close(conn, ps, rs);
		}
		
		return list;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宜春

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值