我写了一个数据库模块(类),里面包括数据库的查询、删除、更新、插入等方法。
现在我在另一个类中定义了两个该数据库对象,先用第一个对象对第一个数据库作了选择操作,返回了一个ResultSet的结果集。然后用第二个对象对第二个数据库作了插入操作,接着又用第一个对象对第一个数据库做了更新操作。我的返回结果集中有多个记录,当对第一条做完更新后就抱错了。错误如下:java.sql.SQLException: Operation not allowed after ResultSet closed我现在的问题是,怎样使ResultSet不自动关闭,又没有什么参数或方法使得他显示关闭时才能关闭?
谢谢!
现在我在另一个类中定义了两个该数据库对象,先用第一个对象对第一个数据库作了选择操作,返回了一个ResultSet的结果集。然后用第二个对象对第二个数据库作了插入操作,接着又用第一个对象对第一个数据库做了更新操作。我的返回结果集中有多个记录,当对第一条做完更新后就抱错了。错误如下:java.sql.SQLException: Operation not allowed after ResultSet closed我现在的问题是,怎样使ResultSet不自动关闭,又没有什么参数或方法使得他显示关闭时才能关闭?
谢谢!
一般不推荐这样,把记录集放入一个ArrayList是比较常见的方法
代码可能稍有点长,只需看看两处写了连续******的地方。在那里定义了Statement和ResultSet对象。
谢谢大家!
/**
* 数据库连接、选择、更新、删除演示
*
*/
//import java.sql.*;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.DriverManager;
import java.util.*;public class DbConnect
{
/////////////////////////////////////////----------->>>数据成员 and 构造函数
private Connection dbConnection;
private Statement dbStatement;
private ResultSet dbResultSet;
public DbConnect()
{
dbConnection = null;
dbStatement = null;
dbResultSet = null;
}
/////////////////////////////////////////----------->>>类方法
/**
* 简化输出
* @param str 用于输出的字符串(String)
*/
public void print(String str)//简化输出
{
System.out.println(str);
}
/**
* 连接MySql数据库
* @param host MySql数据库主机
* @param port MySql数据库端口
* @param dbaName MySql数据库名称
* @param usName MySql数据库用户名
* @param psw MySql数据库密码
* @return bool值,连接成功返回真,失败返回假
*/
public boolean dbConnection(String host, String port, String dbaName, String usName, String psw)
{
String driverName = "com.mysql.jdbc.Driver";//"org.gjt.mm.mysql.Driver"
String dbHost = host;
String dbPort = port;
String dbName = dbaName;
String enCoding = "?useUnicode=true&characterEncoding=gb2312";
String userName = usName;
String Psw = psw;
String url = "jdbc:mysql://" + dbHost + ":" + dbPort + "/" + dbName + enCoding;
try
{
Class.forName(driverName).newInstance();
dbConnection = DriverManager.getConnection(url, userName, Psw);
dbStatement = dbConnection.createStatement();//只有这里定义了一份Statement。******************************
return true;
}catch(Exception e){
print("url = " + url); //发生错误时,将连接数据库信息打印出来
print("userName = " + userName);
print("Psw = " + Psw);
e.printStackTrace(); //得到详细的出错消息
return false;
}
}// end boolean dbConnection(...)
/**
* 对数据库表进行选择操作!
* @param tableName 数据库表名
* @param fields 字段名
* @param selCondition 选择条件
* @return 一个含有map的List(列表)
*/
public ResultSet dbSelect(String tableName, ArrayList fields, String selCondition)
{
String sql = "";
ArrayList mapInList = new ArrayList();
String selFields = "";
for (int i = 0; i<fields.size(); ++i)
selFields += fields.get(i) + ", ";
String selFieldsTem = selFields.substring(0, selFields.length() - 2);//根据String的索引提取子串
try{
// dbStatement = dbConnection.createStatement();
sql = "select " + selFieldsTem + " from " + tableName + " " + selCondition;
try{
dbResultSet = dbStatement.executeQuery(sql);
//这里得到了一份ResultSet的结果集。***********************************************
}catch(Exception err){
print("Sql = " + sql);
print("Exception: " + err.getMessage());
}
}catch(Exception e){
print("Sql = " + sql);
print("Exception: " + e.getMessage());
}
return dbResultSet;
}//end String dbSelect(...)
/**
* 对数据库表中的记录进行删除操作
* @param tableName 数据库表名
* @param condition 删除的条件
* @return bool值,表示删除成功或者失败。
*/
public boolean dbDelete(String tableName, String condition)
{
boolean delResult = false;
String sql = "delete from " + tableName + " " + condition;
try{
dbStatement.executeUpdate(sql); //return int // int delRe = ??
return true;
}catch(Exception e){
print ("sql = " + sql);
e.printStackTrace();
return false;
}
}//end dbDelete(...) /**
* 对数据库表中记录进行更新操作
* @param tabName 数据库表名
* @param reCount 要更新字段的HashMap{字段=值}
* @return bool值,成功返回true,失败返回false
*/
public boolean dbUpdate(String tabName, String updateValues, String upCondition)
{
String sql = "update " + tabName + " set " + updateValues + " " + upCondition;
try
{
dbStatement.executeUpdate(sql);
return true;
}catch(Exception err){
print("sql = " + sql);
err.printStackTrace();
return false;
}
}//end dbUpdate(...)
/**
* 对数据库表进行插入操作
* @param tabName 数据库表名
* @param values 要插入记录的HashMap{字段=值}
* @return bool值,成功返回true,失败返回false
*/
public boolean dbInsert(String tabName, String fields, String values)
{
String sql = "";
sql += "insert into " + tabName + " (" + fields + ") values " + "(" + values + ")";
try
{
dbStatement.executeUpdate(sql);
return true;
}
catch(Exception e)
{
print("Sql = " + sql);
e.printStackTrace();
return false;
}
}//end dbInsert(...)
/**
* 断开数据库
* @return bool值,成功返回true,失败返回false
*/
public boolean dbClose()
{
try
{
if (dbResultSet != null)
dbResultSet.close();
if (dbStatement != null)
dbStatement.close();
if (dbConnection != null)
dbConnection.close();
return true;
}catch(Exception e){
e.printStackTrace();
return false;
}
}//end dbClose()
/////////////////////////////////////////----------->>>入口主函数
public static void main(String[] args)
{
DbConnect dc = new DbConnect();
//连接数据库用到的一些参数.
String dbHost = "192.168.0.199";
String dbPort = "3306";
String dbName = "feast";
String dbuserName = "root";
String dbpsw = "";
boolean con = dc.dbConnection(dbHost, dbPort, dbName, dbuserName, dbpsw); //连接数据库
if (con)
{
ArrayList fields = new ArrayList();
fields.add("message_type");
fields.add("message_content");
// Map lmap = new HashMap();
String selCondition = "where message_type = 1 limit 1";
ResultSet str = dc.dbSelect("feast", fields, selCondition); //--->>>选择记录
String userPhoneNum = null;
String userID = null;
try {
boolean last = str.next();
userPhoneNum = str.getString("message_type");
userID = str.getString("message_content");
} catch (SQLException e) {
e.printStackTrace();
}
dc.print(userPhoneNum);
dc.print(userID);
}
boolean close = dc.dbClose();
if (close)
dc.print("断开成功!");
else
dc.print("断开失败!");
}//end main()
}//end class DbConnect