在默认情况下,同一时间每个 Statement 对象在只能打开一个 ResultSet 对象。
因此,如果读取一个 ResultSet 对象与读取另一个交叉,则这两个对象必须是由不同的 Statement 对象生成的。
如果某个Statement打开了当前的一个 ResultSet 对象,则 Statement 接口中的所有执行方法都会隐式关闭这个ResultSet对象(即这个Statement对象再次执行某个执行方法时就会隐式关闭前一次打开的那个ResultSet对象!!!)。
默认的情况下是一个ResulSet对应一个Statement 的,当用一个Satement 获取2个ResultSet 时,其实 第一个Result 已经关闭了,因为产生第2个ResultSet产生时势必是去调用 Statement的执行方法 产生,此时它会隐式关闭第一个ResultSet。
因此,如果读取一个 ResultSet 对象与读取另一个交叉,则这两个对象必须是由不同的 Statement 对象生成的。
如果某个Statement打开了当前的一个 ResultSet 对象,则 Statement 接口中的所有执行方法都会隐式关闭这个ResultSet对象(即这个Statement对象再次执行某个执行方法时就会隐式关闭前一次打开的那个ResultSet对象!!!)。
public void initTransplantStatus () throws Exception
{
Connection conn=null;
Statement st=null;
Statement st2=null;
ResultSet rs=null;
String sql="";
int id=20;
System.out.println(st.KEEP_CURRENT_RESULT);
int i=1;
try{
conn=DBUtil.getConnection();
conn.setAutoCommit(true);
st=conn.createStatement();
st2=conn.createStatement(); //第二个Statement对象
st.execute("delete from transplant_status");
rs=st.executeQuery("select t.id,cl.id from school t join classes cl on t.id=cl.school_id order by t.id");
while(rs.next())
{
id=id+10;
sql="insert into transplant_status values('"+id+"','"+rs.getString(1)+"','"+rs.getString(2)+"','0',sysdate)";
/**
* 不能再用第一个Statement对象来执行这个执行方法,
* 否则之前的那个ResultSet对象会被隐式关闭,导致while循环只能执行一次!!
*/
st2.execute(sql);
}
conn.commit();
rs.close();
st.close();
st2.close();
conn.close();
}catch(Exception e)
{
System.out.println(e.getMessage());
err="初始化迁移状态表时出错!";
throw new Exception(e.getMessage());
}
}
默认的情况下是一个ResulSet对应一个Statement 的,当用一个Satement 获取2个ResultSet 时,其实 第一个Result 已经关闭了,因为产生第2个ResultSet产生时势必是去调用 Statement的执行方法 产生,此时它会隐式关闭第一个ResultSet。