【问题标题】:"The result set is closed." error after executing“结果集已关闭。”执行后出错
【发布时间】:2016-12-20 12:00:40
【问题描述】:

我正在尝试对数据库执行 3 项操作。

  1. 统计行数(SELECT COUNT(*) FROM TestCaseTable

  2. 插入一行

  3. 再次统计行数

这是为了断言该行已成功插入到数据库中。

这是执行这些操作的存根:

try {
    Class.forName(JDBC_DRIVER).newInstance();
    Connection connection =  DriverManager.getConnection(DB_URL, USERNAME, PASSWORD);
    statement = connection.createStatement();

    System.out.println("Checking before Insertion");
    ResultSet beforeinsertResultSet = statement.executeQuery("SELECT COUNT(*) FROM TestCaseTable");
    beforeinsertResultSet.next();
    int beforeInsertRowCount = beforeinsertResultSet.getInt(1);
    System.out.println("Before Insert "+beforeInsertRowCount);

    String insertTCQuery = "Insert into TestCaseTable ([Test Case Id], [Test Module Name], [Test Priority], [Test Designed By], "
            + "[Test Designed Date], [Test Executed By], [Test Execution Date], [Test Title], [Test Summary], [Pre-Condition],"
            + " [Dependencies], [Test Steps], [Test Data], [Expected result], [Post-Condition], [Actual Result], "
            + "[Test Status], [Notes]) "
            + "Values ('"+ testCaseIdIs +"', '"+ moduleNameIs +"', '"+ priorityIs +"', '"+ testDesignerIs +"', '"+ testDesignDateIs +"', "
                    + "'"+ testExecutedByIs +"', '"+ testExecutionDateIs +"', '"+ titleNameIs +"', '"+ descriptionIs +"', "
                            + "'"+ preConditionIs +"', '"+ dependenciesIs +"', '"+ testStepsIs +"', '"+ testDataIs +"',"
                                    + "'"+ expectedResultsIs +"', '"+ postConditionIs +"', '"+ actualResultIs +"', '"+ testStstusIs +"', "
                                            + "'"+ notesIs +"')";


    statement.executeUpdate(insertTCQuery);

    System.out.println("Checking after Insertion");
    ResultSet afterinsertResultSet = statement.executeQuery("SELECT COUNT(*) FROM TestCaseTable");
    afterinsertResultSet.next();
    int afterInsertRowCount = beforeinsertResultSet.getInt(1);
    System.out.println("Before Insert "+afterInsertRowCount);

    if(afterInsertRowCount == beforeInsertRowCount+1) {
        statusLabel.setText("Inserted Successfully!");
        statusLabel.setForeground(Color.GREEN);
    } else {
        statusLabel.setText("Error Inserting Test Case.");
    }

    beforeinsertResultSet.close();
    afterinsertResultSet.close();
    statement.close();
    connection.close();

} catch (InstantiationException | IllegalAccessException | ClassNotFoundException | SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

插入前检查 插入前检查 11 插入后检查 com.microsoft.sqlserver.jdbc.SQLServerException:结果集是 关闭。在 com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:190) 在 com.microsoft.sqlserver.jdbc.SQLServerResultSet.checkClosed(SQLServerResultSet.java:372) 在 com.microsoft.sqlserver.jdbc.SQLServerResultSet.getInt(SQLServerResultSet.java:2309) 在 com.gs.SaveTestCases.SaveTestCase$ButtonClickListener.actionPerformed(SaveTestCase.java:321) 在 javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 在 javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.fireActionPerformed(未知来源)在 javax.swing.DefaultButtonModel.setPressed(未知来源)在 javax.swing.plaf.basic.BasicButtonListener.mouseReleased(未知 源)在 java.awt.Component.processMouseEvent(未知源)在 javax.swing.JComponent.processMouseEvent(未知来源)在 java.awt.Component.processEvent(未知来源)在 java.awt.Container.processEvent(未知来源)在 java.awt.Component.dispatchEventImpl(未知来源)在 java.awt.Container.dispatchEventImpl(未知来源)在 java.awt.Component.dispatchEvent(未知来源)在 java.awt.LightweightDispatcher.retargetMouseEvent(未知来源)在 java.awt.LightweightDispatcher.processMouseEvent(未知来源)在 java.awt.LightweightDispatcher.dispatchEvent(未知来源)在 java.awt.Container.dispatchEventImpl(未知来源)在 java.awt.Window.dispatchEventImpl(未知来源)在 java.awt.Component.dispatchEvent(未知来源)在 java.awt.EventQueue.dispatchEventImpl(未知来源)在 java.awt.EventQueue.access$500(未知来源)在 java.awt.EventQueue$3.run(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) 在 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(未知 来源)在 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(未知 源)在 java.awt.EventQueue$4.run(未知源)在 java.awt.EventQueue$4.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) 在 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(未知 源)在 java.awt.EventQueue.dispatchEvent(未知源)在 java.awt.EventDispatchThread.pumpOneEventForFilters(未知来源) 在 java.awt.EventDispatchThread.pumpEventsForFilter(未知来源) 在 java.awt.EventDispatchThread.pumpEventsForHierarchy(未知 来源)在 java.awt.EventDispatchThread.pumpEvents(未知来源) 在 java.awt.EventDispatchThread.pumpEvents(Unknown Source) 在 java.awt.EventDispatchThread.run(未知来源)

如您所见,第一行计数和插入成功执行,但第三次操作(再次计数 DB 行)给出错误“The result set is closed”。

谁能告诉我哪里出错了?

编辑: 我所尝试的所有方法在我的情况下都不起作用:

  1. 我创建了新的连接 (connection1)、语句 (statement1) 并将它们用于第二次行计数。

  2. 插入后我已经关闭beforeinsertResultSet

【问题讨论】:

  • 在打开新结果集之前尝试关闭之前的结果集
  • documentation of java.sql.Statement说的很清楚:默认情况下,每个Statement对象只能同时打开一个ResultSet对象。
  • 另外,判断行是否成功插入,使用'statement.executeUpdate(insertTCQuery);'返回的变量。示例:'int count = statement.executeUpdate(insertTCQuery); if(count>0){//插入成功}
  • @XtremeBaumer & @RealSkeptic 我尝试了这两种逻辑,但没有奏效
  • 将 else 块添加到这个 if(count>0) 块中;这样您就可以在这里做任何事情: if(afterInsertRowCount == beforeInsertRowCount+1) { statusLabel.setText("Inserted Successfully!"); statusLabel.setForeground(Color.GREEN); } else { statusLabel.setText("插入测试用例时出错。"); }

标签: java sql-server swing jdbc


【解决方案1】:

这会使您的代码失败:

 int afterInsertRowCount = beforeinsertResultSet.getInt(1);

替换为

int afterInsertRowCount = afterinsertResultSet.getInt(1);

这个beforeinsertResultSet在你执行更新语句后关闭

在哪里可以找到代码:

ResultSet afterinsertResultSet = statement.executeQuery("SELECT COUNT(*) FROM TestCaseTable");
afterinsertResultSet.next();
int afterInsertRowCount = beforeinsertResultSet.getInt(1);
System.out.println("Before Insert "+afterInsertRowCount);

【讨论】:

  • 很好,先生,对不起,这是我的错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
相关资源
最近更新 更多