这是我的DbOperationProcess代码
在此代码中用于操纵数据库中的任何数据显示错误
例如,为了将值检索到JTable,它显示错误
它不能返回任何值为什么?
例如在调用此
时StudentView.java
String query="select * from tbl_student";
rs=db_obj.getData(query);
这是错误
java.sql.SQLException: Operation not allowed after ResultSet closed
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
at com.mysql.jdbc.ResultSetImpl.checkClosed(ResultSetImpl.java:768)
at com.mysql.jdbc.ResultSetImpl.next(ResultSetImpl.java:7008)
at DbApp.ViewStudents.initTable(ViewStudents.java:49)
at DbApp.ViewStudents.<init>(ViewStudents.java:23)
请纠正我
package DbApp;
import java.sql.*;
/**
*
* @author DELL
*/
public class DbOperationProcess {
ResultSet rs = null;
int value = 0;
Statement st = null;
Connection conn = null;
public ResultSet getData(String query) {
try {
conn = DbOperation.getConnection();
st = conn.createStatement();
rs = st.executeQuery(query);
System.out.println(query);
} catch (Exception ae) {
ae.printStackTrace();
} finally {
try {
DbOperation.closeConnection(rs, st, conn);
} catch (Exception ae) {
}
}
return rs;
}
public void setData(String query) {
try {
conn = DbOperation.getConnection();
st = conn.createStatement();
st.execute(query);
} catch (Exception ae) {
ae.printStackTrace();
} finally {
try {
DbOperation.closeConnection(rs, st, conn);
} catch (Exception ae) {
}
}
}
public int setUpdate(String query) {
try {
conn = DbOperation.getConnection();
st = conn.createStatement();
int value = st.executeUpdate(query);
System.out.println("query");
} catch (Exception ae) {
ae.printStackTrace();
} finally {
try {
DbOperation.closeConnection(rs, st, conn);
} catch (Exception ae) {
}
}
return value;
}
}
这是我的DbOperation代码
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package DbApp;
import java.sql.*;
/**
*
* @author DELL
*/
public class DbOperation
{
public static Connection getConnection()
{
Connection conn=null;;
try
{
String driver = "org.gjt.mm.mysql.Driver";
String databasename = "db_college";
String url = "jdbc:mysql://localhost:3306/";
String username = "root";
String password = "123456";
Class.forName(driver);
conn=DriverManager.getConnection(url+databasename,username,password);
}
catch (ClassNotFoundException cnfe)
{
System.out.println("JDBC Driver not found" + cnfe);
}
catch (SQLException sqle)
{
System.out.println("JDBC URL Error " + sqle);
}
catch(Exception ae)
{
ae.printStackTrace();
}
return conn;
}
public static void closeConnection(ResultSet rs,Statement st,Connection conn)
{
try
{
if(rs!=null)
{
rs.close();
}
if(st!=null)
{
st.close();
}
if(conn!=null)
{
conn.close();
}
}
catch(Exception ae)
{
}
}
}
答案 0 :(得分:1)
您正在明确关闭resultset
对象
并且您在关闭resultset.next()
resultset
访问它
答案 1 :(得分:0)
您的getData(String query)
方法毫无意义。您应该为每个数据库查询使用不同的方法。您应该在执行查询后立即使用ResultSet。你不应该返回一个ResultSet。您应该返回包含查询返回的数据的对象/对象集合。
您可能认为通过对所有查询使用相同的ResultSet getData(String query)
方法来保存一些代码行,但这种方法不起作用:
您传递的是静态SQL字符串,而不是传递查询参数并使用PreparedStatement执行动态SQL查询,这样更安全。
如果您不以与生成它的方法相同的方式从ResultSet中获取数据,则无法关闭ResultSet和数据库连接,直到您这样做。
答案 2 :(得分:0)
您可以尝试使用CachedRowset
ResultSet resultSet = statement.executeQuery();
CachedRowset cachedRowset = new CachedRowSetImpl();
cachedRowset.populate(resultSet);
return cachedRowset; //returns type ResultSet
在同一方法中,您可以关闭所有3 - 连接,语句,结果集