1. 程式人生 > >MySQL出現 Operation not allowed after ResultSet closed錯誤

MySQL出現 Operation not allowed after ResultSet closed錯誤

今天測試增刪查改的刪除操作時,出現以下Operation not allowed after ResultSet closed的錯誤

原始碼如下:

public static boolean insertUser(UserDTO _user) throws SQLException{
		boolean bool =false;
		Connection conn =null;
		Statement stmt = null;
        ResultSet res = null;
		conn = DataAccesss.getConnection();
		stmt = conn.createStatement();
		
		
		res = stmt.executeQuery("select * from userr where uname ='"+_user.getUname()+"'");//先查詢資料庫中是否存在該使用者名稱,無論是軟刪除或仍存在不能插入。
		if(res.next()==false) {
			int num = stmt.executeUpdate("insert into userr values ('"+_user.getUname()+"','"+_user.getUpassword()+"','"+_user.getTel()+"','"+_user.getSurperuser()+"','"+_user.getFlag()+"')");
			System.out.println("已成功執行"+num+"行插入成功");
			
		}
		else {System.out.println("使用者名稱已存在");}
		if(res.getInt("flag")==1) 
			System.out.println("該使用者被軟刪除,存在資料庫中");
		
		DataAccesss.closeConnection(conn, stmt,res);
		return bool=true;
	}
	

這是由於多個一個stmt多個rs進行操作引起的ResultSet已經關閉的錯誤

一個stmt多個rs進行操作. 那麼從stmt得到的rs1,必須馬上操作此rs1後,才能去得到另外的rs2,再對rs2操作. 不能互相交替使用,會引起rs已經關閉錯誤.

/* 插入功能
	 * 引數列表傳入userr例項
	 * 往表格最後輸入一行元祖
	 * 列印插入行數插入是否成功
	 * (需要修改許可權,使用者自己可以設定自己許可權??!!)
	 */
	public static boolean insertUser(UserDTO _user) throws SQLException{
		boolean bool =false;
		Connection conn =null;
		Statement stmt = null;
        ResultSet res = null;
		conn = DataAccesss.getConnection();
		stmt = conn.createStatement();
		
		
		res = stmt.executeQuery("select * from userr where uname ='"+_user.getUname()+"'");//先查詢資料庫中是否存在該使用者名稱,無論是軟刪除或仍存在不能插入。
		if(res.next()==false) {
			int num = stmt.executeUpdate("insert into userr values ('"+_user.getUname()+"','"+_user.getUpassword()+"','"+_user.getTel()+"','"+_user.getSurperuser()+"','"+_user.getFlag()+"')");
			System.out.println("已成功執行"+num+"行插入成功");
			bool=true;
			
		}
		else {System.out.println("使用者名稱已存在");
		if(res.getInt("flag")==1) 
			System.out.println("該使用者被軟刪除,存在資料庫中");}
		
		DataAccesss.closeConnection(conn, stmt,res);
		return bool;
	}

一個stmt最好對應一個rs, 如果用一個時間內用一個stmt開啟兩個rs同時操作,會出現這種情況. 所以解決此類問題:1.就多建立幾個stmt,一個stmt對應一個rs;2.若用一個stmt對應多個rs的話,那隻能得到一個rs後就操作,處理完第一個rs後再處理其他的

stmt=conn.createStatement(); stmt2=conn.createStatement(); rs=stmt.executeQuery("select * from t1"); rst=stmt2.executeQuery("select * from t2"); rs.last(); rst.last(); ---------------------