当前位置: 首页 > 知识库问答 >
问题:

第二个查询表示,resultset已关闭

彭雨华
2023-03-14

主要:

public static void main(String[] args) throws ClassNotFoundException, SQLException, InstantiationException, IllegalAccessException, InterruptedException {
                DatabaseConnectionHelper con = new DatabaseConnectionHelper();
                ResultSet rs = con.executeQuery("SELECT * FROM [winfiler].[dbo].[customer_data]");
                System.out.println(rs.next());
                while(rs.next()){
                    System.out.println(rs.getString("name"));
                }
                con.releaseResources();
                ResultSet rs3 = con.executeQuery("SELECT * FROM [winfiler].[dbo].[customer_data]");
                System.out.println(rs3.next());
                while(rs3.next()){
                    System.out.println(rs.getString("name"));
                }
    }

用于db连接的Helperclass:

public class DatabaseConnectionHelper {

    private Connection connection=null;
    private PreparedStatement statement=null;
    private ResultSet queryResult=null;

    public Connection connectToDatabase(){
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            connection = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=******;user=********;password=********");
            return connection;
        } catch (ClassNotFoundException ex) {
            MessageHelper.createClassNotFoundExceptionMessage("Eine exception ist aufgetreten", "Classe konnte nicht gefunden werden (Verbindung zur Datenbank)", ex.getMessage());
        } catch (SQLException ex) {
            MessageHelper.createSQLExceptionMessage("Eine exception ist aufgetreten", "Probleme beim der Datenabfrage - DatabaseConnectionHelper", ex.getMessage());
        }
            return null;
    }

    public ResultSet executeQuery(String query){
        try{
            statement = connectToDatabase().prepareStatement(query);
            queryResult = statement.executeQuery();


            return queryResult;
        }catch (SQLException ex) {
            MessageHelper.createSQLExceptionMessage("Eine exception ist aufgetreten", "Probleme beim der Datenabfrage - DatabaseConnectionHelper", ex.getMessage());
        }
        return null;
    }

    public boolean releaseResources(){
        try {
            this.queryResult.close();
            this.statement.close();
            this.connection.close();
            return true;
        } catch (SQLException ex) {
            MessageHelper.createSQLExceptionMessage("Eine exception ist aufgetreten", "Resourcen konnten nicht freigegeben werden - DatabaseConnectionHelper", ex.getMessage());
        }
        return false;
    }
}

共有1个答案

夏侯昊明
2023-03-14

实际的问题是在第二个循环中调用rs.getstring(“name”);而不是rs3.getstring(“name”);

您的ConnectToDatabase()创建一个新连接。因此,只要不同时使用DBConnectionHelper,这就不是问题。

BTW1:您应该避免使用system.out(rs.next());,因为这会产生副作用并跳过第一行。BTW2:您的releaseResources()可以改进:您应该忽略/单独捕捉来自RS和satement的异常,或者至少在finally中关闭连接本身。

 类似资料:
  • 在插入新记录之前,我正在验证记录的存在性。但是,代码不会跳入insert块。在Reader.Close之后跳转到finally block 我怀疑我一定是做错了什么,因为没有例外,而且每次RecordsInfacted=-1

  • 我有三个表:user、home、user_home。 在代码中,我有实体用户和主页。 但是我收到下一条消息:“QuerySyntaxException:UserHome没有映射”

  • 我有两个查询写在同一时间这样: 在执行第二个查询之前,是否可以使用SQL指令或在代码中获取ID? 谢谢:)

  • 假设我有一条这样的路线 我想在第二个查询中使用一些数据,这些数据将由第一个查询返回。但是现在我不能这样做,因为根据我的理解(如果我错了,请纠正我),这两个查询都是promise的,并且是异步工作的,所以它不会等待第一个查询的完成来执行第二个查询。 我将如何重写这一点,使第一个查询的执行总是在执行第二个查询之前首先完成?

  • 问题内容: 我的目标是遍历表tbl,并在遍历该表的同时从另一个表tbl2中选择一个国家缩写(如果存在),并将这些结果附加到最终输出中。 我将使用的示例来自这篇文章 tbl2有一个外键’tbl_id’来tbl,看起来像这样 *注意:并非所有国家/地区都使用缩写。 诀窍是,我希望亚洲所有国家至少显示亚洲的缩写,即“ AS”,即使一个国家没有缩写(例如印度)。如果该国家/地区确实有缩写, 则结果应如下所

  • 问题内容: 我试图加快PHP脚本的速度,目前正在Mysql域中推送一些PHP逻辑。如果第一个Select不返回行或计数为零,是否可以进行其他选择查询? 请记住,第一个查询需要首先运行,并且 仅 当第一个查询返回空集 时才 应激活第二个查询。 对于上面的2个查询,我有这段代码,但似乎每个查询运行两次(一次计数,一次返回)。有一个更好的方法吗? 问题答案: 一种选择是使用有: SQL小提琴演示 这将从