【发布时间】:2016-12-20 12:00:40
【问题描述】:
我正在尝试对数据库执行 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(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”。
谁能告诉我哪里出错了?
编辑: 我所尝试的所有方法在我的情况下都不起作用:
我创建了新的连接 (
connection1)、语句 (statement1) 并将它们用于第二次行计数。插入后我已经关闭
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