rs=st.executeQuery("select id from member"); while(rs.next()) { sql="insert into message values('"; sql+=rs.getString(1)+"','"; sql+=mg.getType()+"','"; sql+=mg.getTheme()+"','"; sql+=mg.getContent()+"','"; sql+=mg.getTime()+"')"; st.executeUpdate(sql); }
上面代碼,rs查詢到多條記錄,但當rs第二次next()時報錯,說rs已關閉,但我並沒關閉rs。
自己想想覺得和st有關,是不是生成該rs的st重新執行其他語句時rs就自動關閉了,於是修改程序,先取出rs的所有內容存到List,再用st去調list里面的數據。
rs=st.executeQuery("select id from member"); ArrayList<String> as=new ArrayList<String>(); while(rs.next()){ as.add(rs.getString(1).trim()); } for(int i=0;i<as.size();i++){ sql="insert into message values('"; sql+=as.get(i)+"','"; sql+=mg.getType()+"','"; sql+=mg.getTheme()+"','"; sql+=mg.getContent()+"','"; sql+=mg.getTime()+"')"; st.executeUpdate(sql); }
果然運行成功。
上網搜資料發現別人的說法:
其實不必關閉 ResultSet;
因為當產生它的 Statement 關閉、重新執行或用於從多結果序列中獲取下一個結果時,該 ResultSet 將被 Statement 自動關閉。
不過我們在寫程序的時候應該做到用完就關閉的習慣。
自己的猜想還是對的。自己基礎不深,好多困難自己要多總結,不要一碰問題就去找資料。不好解決的問題,就用自己能想到的最笨的方法先把他弄通了,再去研究簡便的方法,理解更深的內容!