Ken*_*chi 3 java sql jdbc resultset
我是使用NetBeans的Java初学者,我试图创建类似于教师注册系统的东西.我使用SQL Server 2005来创建数据库.在实施过程中,我试图创建一个功能,使学生能够注册他们的科目,因此该功能基本上搜索学生已完成其先决条件的科目.所以我写了下面的代码:
package GUIs;
import java.sql.*;
import javax.swing.*;
public class AddSubToStd extends javax.swing.JFrame {
final void FillList1(){
try{
String url = "jdbc:sqlserver://localhost:1433;databaseName=BIS";
String username = "sa";
String password = "*****";
Connection conn = DriverManager.getConnection(url,username,password);
Statement stmt = conn.createStatement();
DefaultListModel DLM = new DefaultListModel();
ResultSet res = stmt.executeQuery("SELECT * FROM Students");
while(res.next()){
DLM.addElement(res.getString("ID"));
}
List1.setModel(DLM);
}
catch(SQLException e){
JOptionPane.showMessageDialog(null, e.toString());
}
}
final void FillList2(){
try{
String url = "jdbc:sqlserver://localhost:1433;databaseName=BIS";
String username = "sa";
String password = "*****";
Connection conn = DriverManager.getConnection(url,username,password);
Statement stmt = conn.createStatement();
DefaultListModel DLM = new DefaultListModel();
String Query = "SELECT * FROM FinishedCourses WHERE ID = '"+List1.getSelectedValue()+"'";
ResultSet res = stmt.executeQuery(Query);
ResultSet res1;
String S_Code;
String Query1;
while(res.next()){
S_Code = res.getString("S_Code");
Query1 = "SELECT * From Subjects WHERE Prerequisite = '"+S_Code+"'";
res1 = stmt.executeQuery(Query1);
while(res1.next()){
DLM.addElement(res.getString("S_Code"));
}
}
conn.close();
stmt.close();
List2.setModel(DLM);
}
catch(SQLException e){
JOptionPane.showMessageDialog(null, e.toString());
}
}
public AddSubToStd() {
initComponents();
FillList1();
}
Run Code Online (Sandbox Code Playgroud)
但我得到的SQLException是,当我尝试调用时,结果集已关闭FillList2()
private void UpdateAllowedActionPerformed(java.awt.event.ActionEvent evt) {
try{
String url = "jdbc:sqlserver://localhost:1433;databaseName=BIS";
String username = "sa";
String password = "*****";
Connection conn = DriverManager.getConnection(url,username,password);
FillList2();
}
catch(SQLException e){
JOptionPane.showMessageDialog(null, e.toString());
}
}
Run Code Online (Sandbox Code Playgroud)
有人请帮忙.
您正在重复使用同一个Statement对象来执行两个查询.当stmt用于执行第二个查询时,ResultSet前一个语句返回的 对象将被关闭.为每个查询创建两个对象.
例:
Statement stmt = conn.createStatement();
Statement stmt1 = conn.createStatement();
...
ResultSet res = stmt.executeQuery(Query);
...
while(res.next()){
S_Code = res.getString("S_Code");
Query1 = "SELECT * From Subjects WHERE Prerequisite = '"+S_Code+"'";
res1 = stmt1.executeQuery(Query1); // use a separate statement
while(res1.next()){
DLM.addElement(res.getString("S_Code"));
}
}
Run Code Online (Sandbox Code Playgroud)
这在StatementAPI文档的以下引用中进行了解释:
默认情况下,
ResultSet每个Statement对象只能同时打开一个对象.因此,如果一个ResultSet对象的读取与另一个对象的读取交错,则每个对象必须由不同的Statement对象生成.如果存在打开的对象,则接口中的所有执行方法都会Statement隐式关闭该ResultSet属性的当前对象.
另外强烈建议按照它们分配的相反顺序关闭JDBC资源,即你应该关闭Statements然后关闭它Connection,你应该在一个finally块中执行此操作:
catch(SQLException e){
JOptionPane.showMessageDialog(null, e.toString());
} finally {
if(res != null) {
res.close();
}
if(res1 != null) {
res1.close();
}
if(stmt != null) {
stmt.close();
}
if(stmt1 != null) {
stmt1.close();
}
if(conn != null) {
conn.close();
}
}
Run Code Online (Sandbox Code Playgroud)
如果您使用的是Java 7,则可以使用try-with-resources语句自动关闭这些资源(无需显式调用该close()方法):
// try-with-resources statement declaring two resources
try(Connection conn = DriverManager.getConnection(url,username,password);
Statement stmt = conn.createStatement()) {
...
} catch(SQLException e){
JOptionPane.showMessageDialog(null, e.toString());
}
Run Code Online (Sandbox Code Playgroud)
try-with-resources将确保关闭Statement对象,然后关闭Connection它们.
| 归档时间: |
|
| 查看次数: |
7030 次 |
| 最近记录: |