为什么同时在页面中用多个结果集出错(ResultSet is closed)? 先问你个问题,dbconn是一个连接吗?如果是的话,我没看到连接有executequery这个method,如果不是,那么它是什么?也许,连接可以用这个method,那么我看唯一的问题就是你的connection没有打开。如果还没发现问题的话。那就用e.printStackTrace();看看吧 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 <jsp:useBean id="dbconn" scope="page" class="DBConn.Connection"/>在我的JSP页面中有以下两条语句: ResultSet rs=dbconn.executeQuery(sql); ResultSet rs2=dbconn.executeQuery(sql2);运行报的错误为:javax.servlet.ServletException: ResultSet is closed请问为什么?我是调用Bean通过JDBC与SQL2000连接的。如果只有一个结果集就没事情发生。 原因是:在一个STATEMENT申明中只能产生一个RESULTSET实例,当你执行 ResultSet rs=dbconn.executeQuery(sql); //1 ResultSet rs2=dbconn.executeQuery(sql2); //22的时候,已经把1产生的ResultSet rs覆盖了(closed)当你再调用它的时候当然会报错,方法是,再申明一个STATEMENT,和RESULTSET一对一。 henry_t(henry_t(小白菜)) : 但是我是通过JavaBean来操作的,我在里面写了个method(executeQuery)我现在是通过先操作完一个rs再操作另一个rs,还有没有别的解决方法啊。 这是我用的一个SQL查询函数,一直没出现过问题。public ResultSet openQuery(String str){ ResultSet rs = null; if (str==null||str.trim()==""){ outPrintln("字符串为空!"); return null; } if (conn==null) { outPrintln("数据库连接错误!"); return null; } try{ Statement st = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); rs = st.executeQuery(str); } catch (Exception e){ outPrintln("错误信息:"+e.toString()); return null; } return rs;} 一个Statement实例可以重复复用,执行SQL语句,简单应用程序通常只要生成一个Statement。但每个实例在任何时候只允许激活一个SQL命令,因此有时需要生成多个Statement对象。例如,如果应用程序需要在处理上一个查询结果的同时进行新的查询,则需要在两个Statement实例中发出两个查询。(Java专业编程指南) 你的method(executeQuery)怎么写的,贴出来看看 package DBConn;import java.sql.*;public class DBConnection{ Connection dbconn=null; ResultSet rs=null; Statement stmt=null; String sDriver="sun.jdbc.odbc.JdbcOdbcDriver"; String sConn="jdbc:odbc:java"; String user="sa"; String password=""; public DBConnection() throws Exception { try { Class.forName(sDriver); dbconn=DriverManager.getConnection(sConn,user,password); stmt=dbconn.createStatement(); } catch (ClassNotFoundException E_conn) { E_conn.printStackTrace(); } } public ResultSet executeQuery(String sql) { rs=null; try { rs=stmt.executeQuery(sql); } catch (SQLException E_SQL) { E_SQL.printStackTrace(); } return rs; } public int executeUpdate(String sql) { int i=0; try { i=stmt.executeUpdate(sql); } catch (SQLException E_Update) { E_Update.printStackTrace(); } return i; } }/=============================================================以下是method(executeQuery)/=============================================================package DBConn;import java.sql.*;public class DBConnection{ Connection dbconn=null; ResultSet rs=null; Statement stmt=null; String sDriver="sun.jdbc.odbc.JdbcOdbcDriver"; String sConn="jdbc:odbc:java"; String user="sa"; String password=""; public DBConnection() throws Exception { try { Class.forName(sDriver); dbconn=DriverManager.getConnection(sConn,user,password); stmt=dbconn.createStatement(); } catch (ClassNotFoundException E_conn) { E_conn.printStackTrace(); } } public ResultSet executeQuery(String sql) { rs=null; try { rs=stmt.executeQuery(sql); } catch (SQLException E_SQL) { E_SQL.printStackTrace(); } return rs; } public int executeUpdate(String sql) { int i=0; try { i=stmt.executeUpdate(sql); } catch (SQLException E_Update) { E_Update.printStackTrace(); } return i; } } 不要用公用的Statement,每次查询的时候,都重新定义一个来用。 同一个statement产生的resultset无法做嵌套查询,我想你应该是这个问题. 我按[cypeng(追命)]的意思改了,现在是页面上什么都没有了。package DBConn;import java.sql.*;public class DBConnection{ Connection dbconn=null; String sDriver="sun.jdbc.odbc.JdbcOdbcDriver"; String sConn="jdbc:odbc:java"; String user="sa"; String password=""; public DBConnection() throws Exception { try { Class.forName(sDriver); dbconn=DriverManager.getConnection(sConn,user,password); } catch (ClassNotFoundException E_conn) { E_conn.printStackTrace(); } } public ResultSet executeQuery(String sql) throws SQLException { ResultSet rs=null; Statement stmt=null; stmt=dbconn.createStatement(); try { rs=stmt.executeQuery(sql); } catch (SQLException E_SQL) { E_SQL.printStackTrace(); } return rs; } public int executeUpdate(String sql) throws SQLException { int i=0; Statement stmt=null; stmt=dbconn.createStatement(); try { i=stmt.executeUpdate(sql); } catch (SQLException E_Update) { E_Update.printStackTrace(); } return i; } } 大家说得都对呀,就是statement对应一个resultset,这是一个好习惯 但是我先处理完rs在处理rs2就没事情发生啊。 我改了下你写的,你试试看行不行,我也是新手,大家共同进步!package DBConn;import java.sql.*;public class DBConnection{ Connection dbconn; ResultSet rs; Statement stmt; String sDriver="sun.jdbc.odbc.JdbcOdbcDriver"; String sConn="jdbc:odbc:java"; String user="sa"; String password=""; boolean isright=false; public DBConnection() throws Exception { try { Class.forName(sDriver); dbconn=DriverManager.getConnection(sConn,user,password); } catch (ClassNotFoundException E_conn) { E_conn.printStackTrace(); } } public ResultSet executeQuery(String sql) throws SQLException { rs=null; try{ dbconn=DriverManager.getConnection(sConn,user,password); stmt=dbconn.createStatement(); rs=stmt.executeQuery(sql); } catch (SQLException E_SQL) { E_SQL.printStackTrace(); } return rs; } public int executeUpdate(String sql) throws SQLException { try { dbconn=DriverManager.getConnection(sConn,user,password); Stmt=Conn.createStatement(); Stmt.executeUpdate(sql); isright=true; } catch (SQLException E_SQL) { E_SQL.printStackTrace(); isright=false; } return isright; } } yxyf00(昕昕点灯):你每次执行一个语句都和数据库进行連接,这样不好吧dbconn=DriverManager.getConnection(sConn,user,password); 还没有解决啊,用这个方法也可以解决:<jsp:useBean id="dbconn" scope="page" class="DBConn.DBConnection"/><jsp:useBean id="dbconn2" scope="page" class="DBConn.DBConnection"/>或者先处理完rs再处理rs2也可以(我目前用的,但有时必须要两个同时处理的话那就不管用了。)。但和数据库建多连接(如前面那个方法)了会有性能方面的问题吧。 struts2注解方式 从一个action跳转到另一个action及方法 【求助】JSP页面的框架跳转问题 关于tomcat在服务器上配置ip地址访问的问题 怎么写实现离开网站时后弹出广告窗口 JasperReport与Struts2整合后的img_0_0_1图片问题 优品创新科技招聘IT人员 关于struts-config配置文件中的DTD的问题 如何取得文本框中的值!!! 请问jsp能够打成一个包运行吗?就像java的.jar文件一样?? 求直线与X轴的角度 急急,关于文件上传的问题? http://211.69.206.199 欢迎访问
在我的JSP页面中有以下两条语句:
ResultSet rs=dbconn.executeQuery(sql);
ResultSet rs2=dbconn.executeQuery(sql2);
运行报的错误为:
javax.servlet.ServletException: ResultSet is closed
请问为什么?我是调用Bean通过JDBC与SQL2000连接的。如果只有一个结果集就没事情发生。
ResultSet rs=dbconn.executeQuery(sql); //1
ResultSet rs2=dbconn.executeQuery(sql2); //2
2的时候,已经把1产生的ResultSet rs覆盖了(closed)当你再调用它的时候当然会报错,方法是,再申明一个STATEMENT,和RESULTSET一对一。
但是我是通过JavaBean来操作的,我在里面写了个method(executeQuery)
我现在是通过先操作完一个rs再操作另一个rs,还有没有别的解决方法啊。
ResultSet rs = null;
if (str==null||str.trim()==""){
outPrintln("字符串为空!");
return null;
}
if (conn==null) {
outPrintln("数据库连接错误!");
return null;
}
try{
Statement st = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
rs = st.executeQuery(str);
} catch (Exception e){
outPrintln("错误信息:"+e.toString());
return null;
}
return rs;
}
import java.sql.*;public class DBConnection
{
Connection dbconn=null;
ResultSet rs=null;
Statement stmt=null;
String sDriver="sun.jdbc.odbc.JdbcOdbcDriver";
String sConn="jdbc:odbc:java";
String user="sa";
String password="";
public DBConnection() throws Exception
{
try
{
Class.forName(sDriver);
dbconn=DriverManager.getConnection(sConn,user,password);
stmt=dbconn.createStatement();
}
catch (ClassNotFoundException E_conn)
{
E_conn.printStackTrace();
}
}
public ResultSet executeQuery(String sql)
{
rs=null;
try
{
rs=stmt.executeQuery(sql);
}
catch (SQLException E_SQL)
{
E_SQL.printStackTrace();
}
return rs;
}
public int executeUpdate(String sql)
{
int i=0;
try
{
i=stmt.executeUpdate(sql);
}
catch (SQLException E_Update)
{
E_Update.printStackTrace();
}
return i;
}
}
/=============================================================
以下是method(executeQuery)
/=============================================================
package DBConn;
import java.sql.*;public class DBConnection
{
Connection dbconn=null;
ResultSet rs=null;
Statement stmt=null;
String sDriver="sun.jdbc.odbc.JdbcOdbcDriver";
String sConn="jdbc:odbc:java";
String user="sa";
String password="";
public DBConnection() throws Exception
{
try
{
Class.forName(sDriver);
dbconn=DriverManager.getConnection(sConn,user,password);
stmt=dbconn.createStatement();
}
catch (ClassNotFoundException E_conn)
{
E_conn.printStackTrace();
}
}
public ResultSet executeQuery(String sql)
{
rs=null;
try
{
rs=stmt.executeQuery(sql);
}
catch (SQLException E_SQL)
{
E_SQL.printStackTrace();
}
return rs;
}
public int executeUpdate(String sql)
{
int i=0;
try
{
i=stmt.executeUpdate(sql);
}
catch (SQLException E_Update)
{
E_Update.printStackTrace();
}
return i;
}
}
package DBConn;
import java.sql.*;public class DBConnection
{
Connection dbconn=null;
String sDriver="sun.jdbc.odbc.JdbcOdbcDriver";
String sConn="jdbc:odbc:java";
String user="sa";
String password="";
public DBConnection() throws Exception
{
try
{
Class.forName(sDriver);
dbconn=DriverManager.getConnection(sConn,user,password);
}
catch (ClassNotFoundException E_conn)
{
E_conn.printStackTrace();
}
}
public ResultSet executeQuery(String sql) throws SQLException
{
ResultSet rs=null;
Statement stmt=null;
stmt=dbconn.createStatement();
try
{
rs=stmt.executeQuery(sql);
}
catch (SQLException E_SQL)
{
E_SQL.printStackTrace();
}
return rs;
}
public int executeUpdate(String sql) throws SQLException
{
int i=0;
Statement stmt=null;
stmt=dbconn.createStatement();
try
{
i=stmt.executeUpdate(sql);
}
catch (SQLException E_Update)
{
E_Update.printStackTrace();
}
return i;
}
}
package DBConn;
import java.sql.*;public class DBConnection
{
Connection dbconn;
ResultSet rs;
Statement stmt;
String sDriver="sun.jdbc.odbc.JdbcOdbcDriver";
String sConn="jdbc:odbc:java";
String user="sa";
String password="";
boolean isright=false;
public DBConnection() throws Exception
{
try
{
Class.forName(sDriver);
dbconn=DriverManager.getConnection(sConn,user,password);
}
catch (ClassNotFoundException E_conn)
{
E_conn.printStackTrace();
}
}
public ResultSet executeQuery(String sql) throws SQLException
{
rs=null;
try{
dbconn=DriverManager.getConnection(sConn,user,password); stmt=dbconn.createStatement();
rs=stmt.executeQuery(sql);
}
catch (SQLException E_SQL)
{
E_SQL.printStackTrace();
}
return rs;
}
public int executeUpdate(String sql) throws SQLException
{
try {
dbconn=DriverManager.getConnection(sConn,user,password);
Stmt=Conn.createStatement();
Stmt.executeUpdate(sql);
isright=true;
}
catch (SQLException E_SQL)
{
E_SQL.printStackTrace();
isright=false;
}
return isright;
}
}
你每次执行一个语句都和数据库进行連接,这样不好吧
dbconn=DriverManager.getConnection(sConn,user,password);
用这个方法也可以解决:
<jsp:useBean id="dbconn" scope="page" class="DBConn.DBConnection"/>
<jsp:useBean id="dbconn2" scope="page" class="DBConn.DBConnection"/>
或者
先处理完rs再处理rs2也可以(我目前用的,但有时必须要两个同时处理的话那就不管用了。)。但和数据库建多连接(如前面那个方法)了会有性能方面的问题吧。