我正在尝试对数据库执行3次操作。
计算行数(使用SELECT COUNT(*) FROM TestCaseTable
)
插入行
再次计算行数
这是为了断言该行已成功插入数据库。
以下是执行这些操作的存根:
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
”错误。
有人可以告诉我哪里出错了吗?
编辑: 在我的案例中,我所尝试的一切都没有用:
我创建了新的连接(connection1
),声明(statement1
)并将其用于第二次行计数。
插入后我已关闭beforeinsertResultSet
答案 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);