我写了一个数据库模块(类),里面包括数据库的查询、删除、更新、插入等方法。
现在我在另一个类中定义了两个该数据库对象,先用第一个对象对第一个数据库作了选择操作,返回了一个ResultSet的结果集。然后用第二个对象对第二个数据库作了插入操作,接着又用第一个对象对第一个数据库做了更新操作。我的返回结果集中有多个记录,当对第一条做完更新后就抱错了。错误如下:java.sql.SQLException: Operation not allowed after ResultSet closed我现在的问题是,怎样使ResultSet不自动关闭,又没有什么参数或方法使得他显示关闭时才能关闭?
谢谢!

解决方案 »

  1.   

    你定义statement的时间就定义两个,然后用不同的statement执行不同的sql语句返回不同的RS就行了,这样了就可以取到了,不是你的RS自动关闭了,而是因为你又执行了另一个查询覆盖了以前的RS,自然就不在了啊
      

  2.   

    定义多个ResultSet就行,
    一般不推荐这样,把记录集放入一个ArrayList是比较常见的方法
      

  3.   

    最好是通过ResultSet读取记录封装以后,然后放入ArrayList里面,关闭ResultSet这样对于数据库的性能和数据安全都是最好的
      

  4.   

    建议把记录集放入一个ArrayList
      

  5.   

    用同一个 Statement  去执行2个 executeQuery ,那很可能你 executeQuery 调用第二次就会关闭上次的那个 ResultSet , 不同的驱动可以不同(有些驱动可以开多个,我很久前用Oracle就出现"java.sql.SQLException:用尽的 ResultSet").你的需求要么开 2 个 Statement , 要么放到存储过程里去做.
      

  6.   

    大家好,感谢大家的解答。我连的是MySql数据库。写一个数据库操作的类是为了以后用着方便。但是问题频频。我贴出代码来大家帮我看看。哪里的问题。
    代码可能稍有点长,只需看看两处写了连续******的地方。在那里定义了Statement和ResultSet对象。
    谢谢大家!
    /**
     * 数据库连接、选择、更新、删除演示
     * 
     */
    //import java.sql.*;
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.sql.ResultSet;
    import java.sql.DriverManager;
    import java.util.*;public class DbConnect 
    {
    /////////////////////////////////////////----------->>>数据成员 and 构造函数
    private Connection dbConnection;
    private Statement dbStatement;
    private ResultSet dbResultSet;

    public DbConnect()
    {
    dbConnection = null;
    dbStatement = null;
    dbResultSet = null;
    }

    /////////////////////////////////////////----------->>>类方法
    /**
     * 简化输出
     * @param str 用于输出的字符串(String)
     */
    public void print(String str)//简化输出
    {
    System.out.println(str);
    }

    /**
     * 连接MySql数据库
     * @param host MySql数据库主机
     * @param port MySql数据库端口
     * @param dbaName MySql数据库名称
     * @param usName MySql数据库用户名
     * @param psw MySql数据库密码
     * @return bool值,连接成功返回真,失败返回假
     */
    public boolean dbConnection(String host, String port, String dbaName, String usName, String psw)
    {
    String driverName = "com.mysql.jdbc.Driver";//"org.gjt.mm.mysql.Driver"
    String dbHost = host;
    String dbPort = port;
    String dbName = dbaName;
    String enCoding = "?useUnicode=true&characterEncoding=gb2312"; 
    String userName = usName;
    String Psw = psw;
    String url = "jdbc:mysql://" + dbHost + ":" + dbPort + "/" + dbName + enCoding;
    try
    {
    Class.forName(driverName).newInstance();
    dbConnection = DriverManager.getConnection(url, userName, Psw);
    dbStatement = dbConnection.createStatement();//只有这里定义了一份Statement。******************************
    return true;
    }catch(Exception e){
    print("url = " + url); //发生错误时,将连接数据库信息打印出来
    print("userName = " + userName);
    print("Psw = " + Psw);
    e.printStackTrace(); //得到详细的出错消息
    return false;
    }
    }// end boolean dbConnection(...)
    /**
     * 对数据库表进行选择操作!
     * @param tableName 数据库表名
     * @param fields 字段名
     * @param selCondition 选择条件
     * @return 一个含有map的List(列表)
     */
    public ResultSet dbSelect(String tableName, ArrayList fields, String selCondition)
    {
    String sql = "";
    ArrayList mapInList = new ArrayList();
    String selFields = "";
    for (int i = 0; i<fields.size(); ++i)
    selFields += fields.get(i) + ", ";
    String selFieldsTem = selFields.substring(0, selFields.length() - 2);//根据String的索引提取子串
    try{
    // dbStatement = dbConnection.createStatement();
    sql = "select " + selFieldsTem + " from " + tableName + " " + selCondition;
    try{
    dbResultSet = dbStatement.executeQuery(sql);
    //这里得到了一份ResultSet的结果集。***********************************************
    }catch(Exception err){
    print("Sql = " + sql);
    print("Exception: " + err.getMessage());
    }
    }catch(Exception e){
    print("Sql = " + sql);
    print("Exception: " + e.getMessage());
    }
    return dbResultSet;
    }//end String dbSelect(...)

    /**
     * 对数据库表中的记录进行删除操作
     * @param tableName 数据库表名
     * @param condition 删除的条件
     * @return bool值,表示删除成功或者失败。
     */
    public boolean dbDelete(String tableName, String condition)
    {
    boolean delResult = false;
    String sql = "delete from " + tableName + " " + condition;
    try{
    dbStatement.executeUpdate(sql); //return int // int delRe = ??
    return true;
    }catch(Exception e){
    print ("sql = " + sql);
    e.printStackTrace();
    return false;
    }
    }//end dbDelete(...) /**
     * 对数据库表中记录进行更新操作
     * @param tabName 数据库表名
     * @param reCount 要更新字段的HashMap{字段=值}
     * @return bool值,成功返回true,失败返回false
     */
    public boolean dbUpdate(String tabName, String updateValues, String upCondition)
    {
    String sql = "update " + tabName + " set " + updateValues + " " + upCondition;
    try
    {
    dbStatement.executeUpdate(sql);
    return true;
    }catch(Exception err){
    print("sql = " + sql);
    err.printStackTrace();
    return false;
    }
    }//end dbUpdate(...)

    /**
     * 对数据库表进行插入操作
     * @param tabName 数据库表名
     * @param values 要插入记录的HashMap{字段=值}
     * @return bool值,成功返回true,失败返回false
     */
    public boolean dbInsert(String tabName, String fields, String values)
    {
    String sql = "";
    sql += "insert into " + tabName + " (" + fields + ") values " + "(" + values + ")";
    try
    {
    dbStatement.executeUpdate(sql);
    return true;
    }
    catch(Exception e)
    {
    print("Sql = " + sql);
    e.printStackTrace();
    return false;
    }
    }//end dbInsert(...)

    /**
     * 断开数据库
     * @return bool值,成功返回true,失败返回false
     */
    public boolean dbClose()
    {
    try
    {
    if (dbResultSet != null)
    dbResultSet.close();
    if (dbStatement != null)
    dbStatement.close();
    if (dbConnection != null)
    dbConnection.close();
    return true;
    }catch(Exception e){
    e.printStackTrace();
    return false;
    }
    }//end dbClose()
    /////////////////////////////////////////----------->>>入口主函数

    public static void main(String[] args) 
    {
    DbConnect dc = new DbConnect();
    //连接数据库用到的一些参数.
    String dbHost = "192.168.0.199";
    String dbPort = "3306";
    String dbName = "feast";
    String dbuserName = "root";
    String dbpsw = "";

    boolean con = dc.dbConnection(dbHost, dbPort, dbName, dbuserName, dbpsw); //连接数据库
    if (con)
    {
    ArrayList fields = new ArrayList();
    fields.add("message_type");
    fields.add("message_content");
    // Map lmap = new HashMap();

    String selCondition = "where message_type = 1 limit 1";
    ResultSet str = dc.dbSelect("feast", fields, selCondition); //--->>>选择记录
    String userPhoneNum = null;
    String userID = null;
    try {
    boolean last = str.next();
    userPhoneNum = str.getString("message_type");
    userID = str.getString("message_content");
    } catch (SQLException e) {
    e.printStackTrace();
    }
    dc.print(userPhoneNum);
    dc.print(userID);
    }
    boolean close = dc.dbClose();
    if (close)
    dc.print("断开成功!");
    else
    dc.print("断开失败!");
    }//end main()

    }//end class DbConnect
      

  7.   

    现在有什么问题呢?看得不是明白,你的记录集只取出一第一条记录,你没有close怎么会关闭呢??