“结果集已关闭。”执行

时间:2016-12-20 12:00:40

标签: java sql-server swing jdbc

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

  1. 计算行数(使用SELECT COUNT(*) FROM TestCaseTable

  2. 插入行

  3. 再次计算行数

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

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

    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(未知来源)at   javax.swing.AbstractButton $ Handler.actionPerformed(Unknown Source)at   javax.swing.DefaultButtonModel.fireActionPerformed(未知来源)at   javax.swing.DefaultButtonModel.setPressed(未知来源)at   javax.swing.plaf.basic.BasicButtonListener.mouseReleased(未知   来自)java.awt.Component.processMouseEvent(未知来源)at   javax.swing.JComponent.processMouseEvent(未知来源)at   java.awt.Component.processEvent(未知来源)at   java.awt.Container.processEvent(未知来源)at   java.awt.Component.dispatchEventImpl(未知来源)at   java.awt.Container.dispatchEventImpl(未知来源)at   java.awt.Component.dispatchEvent(未知来源)at   java.awt.LightweightDispatcher.retargetMouseEvent(未知来源)at   java.awt.LightweightDispatcher.processMouseEvent(未知来源)at   java.awt.LightweightDispatcher.dispatchEvent(未知来源)at   java.awt.Container.dispatchEventImpl(未知来源)at   java.awt.Window.dispatchEventImpl(未知来源)at   java.awt.Component.dispatchEvent(未知来源)at   java.awt.EventQueue.dispatchEventImpl(未知来源)at   java.awt.EventQueue.access $ 500(未知来源)at   java.awt.EventQueue $ 3.run(未知来源)at   java.awt.EventQueue $ 3.run(未知来源)at   java.security.AccessController.doPrivileged(Native Method)at   java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege(未知   来源)at   java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege(未知   来自)java.awt.EventQueue $ 4.run(未知来源)at   java.awt.EventQueue $ 4.run(未知来源)at   java.security.AccessController.doPrivileged(Native Method)at   java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege(未知   来自)java.awt.EventQueue.dispatchEvent(未知来源)at   java.awt.EventDispatchThread.pumpOneEventForFilters(未知来源)     at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)     在java.awt.EventDispatchThread.pumpEventsForHierarchy(未知   来自java.awt.EventDispatchThread.pumpEvents(未知来源)     at java.awt.EventDispatchThread.pumpEvents(Unknown Source)at   java.awt.EventDispatchThread.run(未知来源)

    正如您所看到的,第一行计数和插入成功执行但第三行操作(再次计算DB行)会出现“The result set is closed”错误。

    有人可以告诉我哪里出错了吗?

    编辑: 在我的案例中,我所尝试的一切都没有用:

    1. 我创建了新的连接(connection1),声明(statement1)并将其用于第二次行计数。

    2. 插入后我已关闭beforeinsertResultSet

1 个答案:

答案 0 :(得分:2)

这使您的代码失败:

 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);