【问题标题】:com.microsoft.sqlserver.jdbc.SQLServerException: The connection is closed while taking the value of Resultsetcom.microsoft.sqlserver.jdbc.SQLServerException:在获取结果集的值时连接已关闭
【发布时间】:2020-08-15 05:07:53
【问题描述】:
public static ResultSet getTestDatafromSQL(String QueryString) throws SQLException {
    Connection conn = null;
    ResultSet resultSet = null;
    try {
        String dbURL = "jdbc:sqlserver://localhost\\sqlexpress;DatabaseName=master;integratedSecurity=true;";
        conn = DriverManager.getConnection(dbURL);
        if (conn != null) {
            DatabaseMetaData dm = (DatabaseMetaData) conn.getMetaData();
            System.out.println("Driver name: " + dm.getDriverName());
            System.out.println("Driver version: " + dm.getDriverVersion());
            System.out.println("Product name: " + dm.getDatabaseProductName());
            System.out.println("Product version: " + dm.getDatabaseProductVersion().toString());
            Statement stmt = conn.createStatement();
            // Create and execute a SELECT SQL statement.
            resultSet = stmt.executeQuery(QueryString);
            System.out.println(resultSet);
            while(resultSet.next()) {
                System.out.println(resultSet.getString(1));
                //return resultSet.getString(1);
            }
        }
    } catch (SQLException ex) {
        ex.printStackTrace();
    } finally {
        try {
            if (conn != null && !conn.isClosed()) {
                conn.close();
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }
    return resultSet;
}
        

现在在其他班级,我称之为...

@Test(enabled = true)
public void query() throws XPathExpressionException, IOException, SQLException {
    ResultSet sql = utilities.getTestDatafromSQL("SELECT ACCOUNT_NO1,CREDIT_LMT from [BCMASTER$] Where CAST(Trim(BCM_CREDIT_LMT) as float) >5000");
    //System.out.println(sql.first());
    System.out.println("SQLValue:"+sql.getString(1));
    System.out.println("SQLValue:"+sql.getString(2));
}

我在 8 月 15 日星期六 10:25:24 IST 2020 com.microsoft.sqlserver.jdbc.SQLServerException:连接已关闭。 - 测试用例失败

要读取结果集,数据库连接应该是打开的?

从每个查询中我会得到不同的列,那么有没有可能我们可以将它存储在数组中并且返回是唯一的可能性或结果集可以获得值?

【问题讨论】:

  • 仅供参考: DriverManager.getConnection() 不能返回 null,因此 if (conn != null) 语句是不必要的/多余的/多余的。

标签: java sql-server


【解决方案1】:

您在方法getTestDatafromSQL() 中关闭了Connection,因此返回ResultSet 毫无意义。考虑将ResultSet 存储在java.util.List 中,并让getTestDatafromSQL() 方法返回List 而不是ResultSet

或者,不要关闭方法getTestDatafromSQL()中的Connection并返回ResultSet和调用getTestDatafromSQL()的方法(根据您问题中的代码,方法query())可以关闭Connection。在接口ResultSet调用getStatement(),它返回一个Statement,在接口Statement调用getConnection(),它返回Connection,然后你可以关闭它。

另一种选择是使用CachedRowSet

这是我对上述第一个选项的实现。

public static List<List<String>> getTestDatafromSQL(String QueryString) throws SQLException {
    Connection conn = null;
    ResultSet resultSet = null;
    List<List<String>> result = new ArrayList<>();
    List<String> row;
    try {
        String dbURL = "jdbc:sqlserver://localhost\\sqlexpress;DatabaseName=master;integratedSecurity=true;";
        conn = DriverManager.getConnection(dbURL);
        if (conn != null) {
            Statement stmt = conn.createStatement();
            // Create and execute a SELECT SQL statement.
            resultSet = stmt.executeQuery(QueryString);
            while (resultSet.next()) {
                row = new ArrayList<>();
                row.add(resultSet.getString(1));
                row.add(resultSet.getString(1));
                result.add(row);
            }
        }
    }
    catch (SQLException ex) {
        ex.printStackTrace();
    }
    finally {
        try {
            if (conn != null && !conn.isClosed()) {
                conn.close();
            }
        }
        catch (SQLException ex) {
            ex.printStackTrace();
        }
    }
    return result;
}

这是我对第二个选项的实现。

public static ResultSet getTestDatafromSQL(String QueryString) throws SQLException {
    Connection conn = null;
    ResultSet resultSet = null;
    String dbURL = "jdbc:sqlserver://localhost\\sqlexpress;DatabaseName=master;integratedSecurity=true;";
    conn = DriverManager.getConnection(dbURL);
    Statement stmt = conn.createStatement();
    // Create and execute a SELECT SQL statement.
    resultSet = stmt.executeQuery(QueryString);
    return resultSet;
}

然后您将调用该方法,然后像这样关闭Connection

ResultSet sql = utilities.getTestDatafromSQL("SELECT ACCOUNT_NO1,CREDIT_LMT from [BCMASTER$] Where CAST(Trim(BCM_CREDIT_LMT) as float) >5000");
// Handle the ResultSet
sql.getStatement().getConnection.close();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    相关资源
    最近更新 更多