2016-12-20 4 views
-1

Я пытаюсь выполнить 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 (Неизвестный источник) в javax.swing.DefaultButtonModel.fireActionPerformed (Неизвестный источник) в javax.swing.DefaultButtonModel.setPressed (Неизвестный источник) в javax.swing.plaf.basic.BasicButtonListener.mouseReleased (Неизвестный источник) в java.awt.Component.processMouseEvent (Unknown Source) в javax.swing.JComponent.processMouseEvent (Unknown Source) в java.awt.Component .processEvent (Unknown Source) на java.awt.Container.processEvent (Unknown Source) в java.awt.Component.dispatchEventImpl (Unknown Source) в java.awt.Container.dispatchEventImpl (Unknown Source) в java.awt .Component.dispatchEvent (Неизвестный источник) в java.awt.LightweightDispatcher.retargetMouseEvent (Неизвестный источник) в java.awt.LightweightDispatcher.processMouseEvent (Неизвестный источник) в java.awt.LightweightDispatcher.dispatchEvent (Unk Nown Источник) на java.awt.Container.dispatchEventImpl (Unknown Source) в java.awt.Window.dispatchEventImpl (Unknown Source) в java.awt.Component.dispatchEvent (Unknown Source) в java.awt.EventQueue. dispatchEventImpl (Unknown Source) в java.awt.EventQueue.access $ 500 (Unknown Source) на java.awt.EventQueue $ 3.run (Unknown Source) в java.awt.EventQueue $ 3.run (Unknown Source) в 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 (Неизвестный источник) на java.security.AccessController.doPrivileged (собственный метод) на java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege (Неизвестный Источник) на java.awt.EventQueue.dispatchEvent (Unknown Source) в java.awt.EventDispatchThread.pumpOneEventForFilters (Unknown Source) в java.awt.EventDispatchThread.pumpEventsForFilter (Unknown Source) в java.awt.EventDispatchThread.pumpEventsForHierarchy (Неизвестный Источник) на java.awt.EventDispatchThread.pumpEvents (Unknown Source) в java.awt.EventDispatchThread.pumpEvents (Unknown Source) на java.awt.EventDispatchThread.run (Unknown Source)

Как вы можете видеть, счет первой строки и вставка успешно выполняются но третья операция (строка счетчика DB снова) дает ошибку «The result set is closed».

Может кто-нибудь сказать мне, где я ошибаюсь?

EDIT: Что все, что я пытался, не работали в моем случае:

  1. Я создал новый Connection (connection1), заявление (statement1) и использовал их для второго раза количества строк.

  2. Я закрыл beforeinsertResultSet после вставки

+0

попробовать с закрытием ваш предыдущий результат установлен перед открытием нового – XtremeBaumer

+0

[Документация 'java.sql.Statement'] (https://docs.oracle.com /javase/7/docs/api/java/sql/Statement.html) ясно говорит: _ По умолчанию, только один объект ResultSet для объекта Statement может быть открыт одновременно. – RealSkeptic

+0

Кроме того, утверждение строки успешно вставлено или нет , используйте переменную, возвращаемую 'statement.executeUpdate (insertTCQuery);'. Пример: 'int count = statement.executeUpdate (insertTCQuery); if (count> 0) {// вставлен успешно} – Amit1011

ответ

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

Nice catch sir, Извините, это было плохо. – Ashish

Смежные вопросы