com.microsoft.sqlserver.jdbc.SQLServerException: 结果集已关闭

转载 2012年03月29日 10:27:01

提示错误:

com.microsoft.sqlserver.jdbc.SQLServerException:结果集已关闭

错误引起原因:

ResultSet内嵌套使用ResultSet引起的

问题的引起:

我做了一个简单的demo

     Connection conn = null;

     Statement stat = null;

     ResultSet rs = null;

     ResultSet rs_2 = null;

try {

    conn = DbPool.getConnection();

    stat = conn.createStatement();

    rs = stat.executeQuery(sql);

    while (rs.next()) {

    …………….省略。。。。

        rs_2= stat.executeQuery(sql_test);

              while(rs.next()){

           ……..省略

}

}

错误就这样引起了。

可以很直接的看出:首先我用Statement对象产生了一个ResultSet对象rs,遍历此对象,取出一个值作为条件拼装了另一个SQL,然后又用同一个Statement对象产生了第二个ResultSet对象rs_2,错误就此产生了-------外层的rs只执行了一次,循环倒第二个值时就提示错误:结果集已经关闭!

错误原因:

java里每个ResultSet结果集都需要一个单独的statement来支撑,如果想使用多个Result就必须使用创建多个statement

解决办法:

1.创建2个Statement对象,嵌套的内外层各用一个;

2.不要采用ResultSet的嵌套-----首先遍历外层Resulet,把结果集放入一个List,然后遍历这个List,在这个List中在使用Statement对象重新产生了ResultSet对象

延伸理解:

执行了Statement的任何一个方法,比如execute(),executeUpdate(),executeQuery()等方法,这时候它的返回值就和这个Statement绑定了,如果要使用此返回值,在使用期间就不能再利用这个Statement做其他事情了,因为它是独占的,一旦在此期间被使用,则返回值自动会被清空(对于execute(),executeUpdate()的返回值就无所谓了,因为她们返回的都是一个boolean或int类型的值,不是一个List,没有遍历的必要)。。。

所有,当遇到我们通过一个Statement的executeQuery()得到一个ResultSet对象时候,如果在遍历这个ResultSet期间想再次使用Statement执行另一个SQL,其一是另一个SQL用Statement2(新产生的Statement对象)执行,其二是把ResultSet对象里面的值放到一个集合中,然后遍历集合,此时因为ResultSet是没用的,所有Statement可以使用;------但是我们可以看出,第二种做法有自身的局限性,因为一旦这个ResultSet对象非常大,把它放入一个集合显然是不明智的。。。。

com.microsoft.sqlserver.jdbc.SQLServerException: 结果集已关闭(遇到过,有用哦!)

提示错误: com.microsoft.sqlserver.jdbc.SQLServerException: 结果集已关闭 错误引起原因: ResultSet内嵌套使用Resul...
  • A1216553605
  • A1216553605
  • 2012-10-07 16:38:23
  • 1247

com.microsoft.sqlserver.jdbc.SQLServerException: 结果集没有当前行

参考博客com.microsoft.sqlserver.jdbc.SQLServerException: 结果集没有当前行 java获取结果集,if(rs!=null),和while(rs....
  • luoxia0805
  • luoxia0805
  • 2014-12-16 11:05:26
  • 3871

jdbc 操作数据库出现【结果集已关闭】的原因

原因一、在取出结果之前把rs关闭了(这种情况大家都容易发现和解决) 原因二、违背了jdbc存储过程先检索结果,再检索out参数的顺序 片段代码如下: CallableStatement ps...
  • Garmiter
  • Garmiter
  • 2012-09-05 18:27:43
  • 2609

com.microsoft.sqlserver.jdbc.SQLServerException: 该连接已关闭

com.microsoft.sqlserver.jdbc.SQLServerException: 该连接已关闭的解决方案 ERROR http-8080-13 org.dbforms.event.da...
  • gaoqiao1988
  • gaoqiao1988
  • 2013-07-03 17:30:27
  • 4069

解决插入语句问题:com.microsoft.sqlserver.jdbc.SQLServerException: 该语句没有返回结果集

问题描述:使用SqlServer2008,当要向数据库插入数据时,总是
  • lsh199196
  • lsh199196
  • 2014-11-07 10:37:15
  • 765

com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立 安全连接。错误:“SQL

部署项目的时候碰到一个特别头疼的问题,折腾了老娘一个礼拜才搞定,特此修文一篇,先把错误代码贴过来: Caused by: com.microsoft.sqlserver.jdbc.SQLServerE...
  • xiaoguo321
  • xiaoguo321
  • 2017-09-29 18:04:20
  • 977

连接Sql2005报的错误:Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: 到主机 的 TCP/IP 连接失败

这是也是我第一次用sql2005,中间还是有很多知识不清楚,这是以后需要加强的,我装好sql2005,并且保证数据库中有数据,且服务时启动着的,我在MyEclipse中Tomcat6.0部署了自己的项...
  • yinyuan1987
  • yinyuan1987
  • 2009-12-27 14:33:00
  • 9519

atitit.故障排除------有时会错误com.microsoft.sqlserver.jdbc.SQLServerException: Connection reset by peer: soc

atitit.故障排除------有时会错误com.microsoft.sqlserver.jdbc.SQLServerException: Connection reset by peer: soc...
  • attilax
  • attilax
  • 2014-11-26 20:24:14
  • 4070

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: 接收 TDS 预登录响应时发生 I/O 错误。

org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (接收 TDS 预登录响应时发生...
  • kangchutoudewa
  • kangchutoudewa
  • 2014-11-11 17:36:05
  • 1475

加载驱动成功com.microsoft.sqlserver.jdbc.SQLServerException: 不支持此服务器版本。目标服务器必须是 SQL Server 2000 或更高版本。链接失败

“加载驱动成功com.microsoft.sqlserver.jdbc.SQLServerException: 不支持此服务器版本。目标服务器必须是 SQL Server 2000 或更高版本。链接失...
  • lizhengnanhua
  • lizhengnanhua
  • 2012-12-23 11:26:21
  • 8603
收藏助手
不良信息举报
您举报文章:com.microsoft.sqlserver.jdbc.SQLServerException: 结果集已关闭
举报原因:
原因补充:

(最多只允许输入30个字)