获取错误SQLServerException:结果集已关闭

时间:2019-01-28 12:17:56

标签: java sql-server stored-procedures jdbc resultset

我已经尝试了很多方法,但是总是出现此错误。
实际上,我正在尝试访问其他类的结果集值,并且对于数据库查询,我创建了一个单独的类。

请不要将其标记为先前询问的内容,因为我仅获得单一类的解决方案。
这是我的DBVerification类

    public class DBVerification {
        private static String DB_URL = PropertyManager.getInstance().getDB_URL();
        private static String DB_USER= PropertyManager.getInstance().getDB_USER();
        private static String DB_PASSWORD= PropertyManager.getInstance().getDB_PASSWORD();
        private static String DBClass= PropertyManager.getInstance().getDBClass();
        private static Connection connection;
        public static ArrayList<ResultSet> executeStoredProcedure(String query) throws ClassNotFoundException, SQLException
            {   
                   ArrayList<ResultSet> resultset = new ArrayList<ResultSet>();
                   Class.forName(DBClass);
                   connection= DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
                   CallableStatement cstmt = connection.prepareCall( "{ call " + query+" }" );
                   //System.out.println("{ call " + query+" }");
                  try {
                   boolean results = cstmt.execute();
                   int rsCount = 0;
                   do {
                        if(results) {
                           ResultSet rs = cstmt.getResultSet();
                           resultset.add(rs);
                           rsCount++;
                           System.out.println("RESULT SET #" + rsCount);
                          // rs.close();
                        }
                        System.out.println();
                        results = cstmt.getMoreResults();
                        } while(results);
                   //cstmt.getMoreResults(Statement.KEEP_CURRENT_RESULT);
                   //cstmt.close();
                  }
                   catch (Exception e) {
                          e.printStackTrace();
                       }
                  return resultset;
            }
public static void closeDB() throws SQLException
    {        
               connection.close();        
    }
    }

这是我的第二堂课报销班

public class Reimbursement
{
ArrayList<ResultSet> result = DBVerification.executeStoredProcedure("getreimbursements");
      for (ResultSet curInstance: result) {
          if(result.indexOf(curInstance) == 0)
                  {
              while(curInstance.next())
              {
                     String branchName=curInstance.getString("BranchName");
                     String department=curInstance.getString("DepartmentName");
                     String employee=curInstance.getString("EmployeeName");
                     String title=curInstance.getString("Title");
                     String claimdate=ValueConverter.DateFormat(curInstance.getString("Date"));  


              }
              curInstance.close();

                  }
          if(result.indexOf(curInstance) == 1)
          {
              while(curInstance.next())
              {
                  String category=curInstance.getString("Category");
                     String expensedate=ValueConverter.DateFormat(curInstance.getString("ExpenseDate"));
                     String description=curInstance.getString("Description");
                     String approvedby=curInstance.getString("ApprovedBy");


              }
              curInstance.close();

          }
        }
         DBVerification.closeDB();
}

请不要寻找main方法,因为这是用于测试类,因此我已经在xml文件中使用了该类。
请给我建议,我做错了什么,会给我错误消息“结果集已关闭”。

异常图像实际上是我的测试类,因此它只会以这种形式显示错误,我已经编辑了指示的行
exception message

1 个答案:

答案 0 :(得分:1)

认为,您的问题可能如下

  • 您遍历对存储过程调用的响应,将调用中的每个结果集添加到数组列表中
  • 您将arraylist返回到调用方法并对其进行迭代
  • 您尝试依次处理每个结果集。

不幸的是,我认为cstmt.getMoreResults()的操作会先关闭所有打开的结果集,然后再移至下一个结果集。您最终得到的是封闭的ResultSet对象的数组列表。当您尝试从中读取内容时,出现错误消息“结果集已关闭”

来自Java文档

  

boolean getMoreResults()                   抛出SQLException

     

移动到此Statement对象的下一个结果,如果它是一个a,则返回true   ResultSet对象,并隐式关闭任何当前ResultSet   使用方法getResultSet获得的对象。